主頁 > 後端開發 > JDK8 新特性分析及實踐(二)---方法、流式操作、新日期

JDK8 新特性分析及實踐(二)---方法、流式操作、新日期

2021-01-31 14:31:36 後端開發

文章目錄

    • 一、方法(MethodReference)參考
      • 1.1 概述
      • 1.2 應用場景
      • 1.3 快速入門分析
      • 1.4 應用案例增強分析
        • 1.4.1 構造器方法參考
        • 1.4.2 類靜態方法參考
        • 1.4.3 類實體方法參考
        • 1.4.4 物件實體方法參考
    • 二、Stream 式操作應用
      • 2.1 概述
      • 2.2 應用場景
      • 2.3 快速入門分析
      • 2.4 應用案例增強分析
        • 2.4.1 Stream物件創建
        • 2.4.2 Stream中間操作
        • 2.4.3 Stream終止操作
      • 2.5 Stream練習
    • 三、新日期物件應用
      • 3.1 概述
      • 3.2 應用場景分析
      • 3.3 快速入門分析
        • 3.3.1 常用API應用分析:
        • 3.3.2 Instant 基本應用
      • 3.4 應用案例增強分析

一、方法(MethodReference)參考

1.1 概述

方法參考是用來直接參考類方法、實體方法或者構造方法的一種新的方式,這里要特別強調一點的是“方法參考”提供的是一種對方法的參考而不是執行方法的方式,簡單點理解的話就是可以將方法作為引數進行傳遞,我們還可以將方法參考理解為lambda的一種深層表達,

1.2 應用場景

方法參考是一種更簡潔易懂的Lambda運算式,運算子是雙冒號"::",也可以將方法參考看成是一個更加緊湊,易讀的Lambda運算式,

1.3 快速入門分析

定義一個list集合,然后基于Lambda運算式迭代集合中的內容進行輸出,關鍵代碼如下:

List<String> list = Arrays.asList("a","b","c");
list.forEach(str -> System.out.println(str));

基于方法參考的方式,輸出list集合中的具體內容的,然后與傳統Lambda運算式方式,進行對比分析,關鍵代碼如下:

list.forEach(System.out::println);

說明:當你要訪問的介面方法與執行的方法參考引數相同,回傳值也相同即可直接使用方法參考,

案例展示:

package com.cy.java8.methodref;

import java.io.PrintStream;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class TestObjectInstanceMethodRef01 {
	public static void main(String[] args) {
		List<String> list = Arrays.asList("A","B","C","D");
		//傳統方式的寫法
		list.forEach(new Consumer<String>() {
			@Override
			public void accept(String t) {//消費型介面,沒有回傳值
				// TODO Auto-generated method stub
				System.out.println(t);
			}
		});
		
		//lambda運算式的方式
		System.out.println("=========lambda運算式的方式=========");
		list.forEach(t -> System.out.println(t));
		
		//物件實體方法參考方式
		System.out.println("=========方法參考方式=========");
		PrintStream ps = System.out;
		list.forEach(ps::println);
		
		list.forEach(System.out::println);
	}
}

1.4 應用案例增強分析

JDK8方法的參考可分為如下幾類:

1.4.1 構造器方法參考

格式:ClassName::new,應用默認建構式,

package com.cy.java8.methodref;
import java.util.function.Supplier;
public class TestConstructorMethodRef01 {
	public static void main(String[] args) {
	    //1.傳統方式
	    Supplier<Object> s1=new Supplier<Object>() {
			@Override
			public Object get() {
				return new Object();
			}
	    };
	    System.out.println(s1.get());
	    //2.Lambda方式
	    Supplier<Object> s2=()->new Object();
	    System.out.println(s2.get());
	    
	    //3.構造方法參考"類名::new"
	    Supplier<Object> obj=Object::new;
	    System.out.println(obj.get());
		
		Supplier<Object> supplier4 = Date::new;
		System.out.println(supplier4.get());
	}
}

1.4.2 類靜態方法參考

格式:ClassName::static_method

package com.cy.java8.methodref;
import java.util.function.Function;

public class TestClassMethodRef01 {
	public static void main(String[] args) {
	    //1.傳統應用方式
	    Function<String, Integer> f1=new Function<String, Integer>() {
	        @Override
	        public Integer apply(String t) {
		        return Integer.parseInt(t);
	        }
	    };
	    Integer result=f1.apply("100");
	    System.out.println(result);
	    //2.lambda應用方式
	    Function<String, Integer> f2=(t)->Integer.parseInt(t);
	    System.out.println(f2.apply("200"));
	    //3.類方法參考應用方式"類名::方法名"
	    Function<String,Integer> f3=Integer::parseInt;
	    System.out.println(f3.apply("300"));
	}
}

練習:比較兩個整數大小(附答案)

Comparator<Integer> com=Integer::compare;
System.out.println(com.compare(39, 20));
package com.cy.java8.methodref;

import java.util.Comparator;

/**
 * 類方法::練習
 * @author lixin
 */
public class TestClassMethodRef02 {
	public static void main(String[] args) {
		//1.傳統方式
		Comparator<Integer> c1 = new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				return Integer.compare(o1, o2);
			}
		};
		
		//2.lambda運算式方式
		Comparator<Integer> c2 = (o1,o2) -> Integer.compare(o1, o2);
		
		//3.類方法參考
		Comparator<Integer> c3 = Integer::compare;
		System.out.println(c3.compare(10, 20));//-1
	}
}

1.4.3 類實體方法參考

格式:ClassName::method,方法不能帶引數,

package com.cy.java8.methodref;
import java.io.File;
import java.util.function.Function;
public class TestClassInstanceMethodRef01 {
	public static void main(String[] args) {
	    //1.傳統方式
	    Function<File,String> f1=new Function<File,String>() {
	        @Override
	        public String apply(File f) {
	        	return f.getAbsolutePath();
	        }
	    };
	    System.out.println(f1.apply(new File("pom.xml")));
	    //2.Lambda方式
	    Function<File,String> f2=file->file.getAbsolutePath();
	    System.out.println(f2.apply(new File("pom.xml")));
	    
	    //3.類實體方法參考"類名::實體方法名"
	    Function<File,String> f3=File::getAbsolutePath;
	    System.out.println(f3.apply(new File("pom.xml")));  
	}
}

練習:(附答案)

Arrays.sort(strArray,(s1,s2)->s1.compareToIgnoreCase(s2));
Arrays.sort(strArray, String::compareToIgnoreCase);
package com.cy.java8.methodref;

import java.util.Arrays;
import java.util.Comparator;

/**
 * 類實體方法參考"類名::實體方法名"練習
 * Arrays.sort()排序的方法
 * @author lixin
 */
public class TestClassInstanceMethodRef02 {
	public static void main(String[] args) {
		//對陣列內容進行排序
		String[] strArray = {"b","a","c","abc","abcd","bce"};
		//1.傳統方式
		Arrays.sort(strArray,new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return o1.compareToIgnoreCase(o2);
			}
		});
		System.out.println(Arrays.toString(strArray));
		
		//2.lambda運算式寫法
		Arrays.sort(strArray,(o1,o2)->o1.compareTo(o2));
		
		//3.類實體方法參考
		Arrays.sort(strArray,String::compareToIgnoreCase);
	}
}

在這里插入圖片描述

1.4.4 物件實體方法參考

格式:物件實體::method,方法不能帶引數,

public class TestObjectInstanceMethodRef01 {
	public static void main(String[] args) {
	    List<String> list=Arrays.asList("A","B","C");
	    //傳統方式
	    list.forEach(new Consumer<String>() {
	        @Override
	        public void accept(String t) {
	        	System.out.println(t);
	        }
	    });
	    //Lambda運算式方式
	    list.forEach(t->System.out.println(t));
	    //方法參考方式
	    PrintStream ps=System.out;
	    list.forEach(ps::println);
	    list.forEach(System.out::println);
	}
}

練習:

List<Integer> list=Arrays.asList(10,20);
Supplier<Integer> supplier=(list::size);
System.out.println(supplier.get());

二、Stream 式操作應用

2.1 概述

Stream 作為 Java 8 的一大亮點,它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念,Java 8 中的 Stream 是對集合(Collection)物件功能的增強,它專注于對集合物件進行各種非常便利、高效的聚合操作,或者大批量資料操作,

2.2 應用場景

在當今這個資料爆炸的時代,資料來源多樣化、資料海量化,很多時候不得不脫離 RDBMS,以底層回傳的資料為基礎進行更上層的資料統計,而原有 Java 的集合 API 中,僅僅有極少量的輔助型方法,更多的時候是程式員需要用 Iterator 來遍歷集合,然后完成相關的聚合應用邏輯,這是一種遠不夠高效而且相對比較笨拙的方法,在JDK8中使用 Stream 物件,不僅豐富了在業務層面對資料處理的方式,還可以讓代碼更加簡潔、易讀和高效,

2.3 快速入門分析

我們在使用Stream物件時,一般會按照如下為三個步驟進行操作:

  • 第一步:創建Stream流物件;
  • 第二步:Stream流中間操作;
  • 第三步:Stream流終止操作;

Stream物件的操作程序,可通過下面的圖進行進一步分析,
在這里插入圖片描述
Steam物件簡易應用,代碼如下:

package com.cy.java8.stream;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/*
 * 流式操作
 */
public class TestStream01 {
	public static void main(String[] args) {
		List<Integer> list = Arrays.asList(1,2,3,8,7,4,5,9,23);
		//1.傳統寫法
		long count = list.stream().filter(new Predicate<Integer>() {
			@Override
			public boolean test(Integer t) {
				// TODO Auto-generated method stub
				return t%2==0;
			}
		}).count();
		System.out.println("傳統方式:"+count);
		
		//2.lambda運算式寫法
		long count2 = list.stream()
						  .filter((t)->t%2==0)
						  .count();
		System.out.println("lambda方式:"+count2);
	}
}

2.4 應用案例增強分析

2.4.1 Stream物件創建

Stream物件的創建,常見方式有如下幾種:

  • 借助Collection介面中的stream()或parallelStream()方法;
  • 借助Arrays類中的stream(…)方法;
  • 借助Stream類中的of(…)方法;
  • 借助Stream類中的iterator和generator方法(無限操作)

Stream物件創建,案例分析如下:

	Collection<Integer> col=new ArrayList<>();

	...
    Stream<Integer> s1=col.stream();
    Stream<Integer> s2=col.parallelStream();
            
    IntStream s3=Arrays.stream(new int[] {1,2,3,4});
    Stream<Integer> s4=Stream.of(10,20,30,40);
            
    Stream<Integer> s5=Stream.iterate(2, (x)->x+2);
    s5.forEach(System.out::println);
            
    Stream<Double> s6=Stream.generate(()->Math.random());
    s6.forEach(System.out::println);

2.4.2 Stream中間操作

Stream 物件創建以后可以基于業務執行一些中間操作,但這些操作的結果需要借助終止操作進行輸出,案例分析如下:

初始條件:給定list集合作為Stream操作的物件,代碼如下:

List<Integer> list=Arrays.asList(100,101,102,200);

對資料進行過濾:

//輸出集合中所有的偶數
//1.創建流
Stream<Integer> s1=list.stream();
//2.中間操作(過濾)
Stream<Integer> s2=s1.filter((n)->n%2==0);
//3.終止操作
s2.forEach(System.out::println);
//也可以將多個操作合在一起
list.stream().filter(n->n%2==0).forEach(System.out::println);

限定操作(limit)

list.stream().filter(n->n%2==0).limit(2).forEach(System.out::println);

跳過操作(skip)

list.stream().filter(n->n%2==0).skip(2).forEach(System.out::println);

去重操作(distinct)

list.stream().distinct().forEach(System.out::println);

排序操作(sorted):底層基于內部比較器Comparable或外部Comparator比較器進行比對

list.stream().sorted().forEach(System.out::println);
list.stream().sorted((s1,s2)->{//Comparator
            	return s1-s2;
            }).forEach(System.out::println);

映射操作(map)

List<String> list=Arrays.asList("a","bc","def");
list.stream().map((x)->x.toUpperCase()).forEach(System.out::println);
list.stream().map((x)->x.length()).forEach(System.out::println);

2.4.3 Stream終止操作

Stream終止操作是Stream的結束操作,案例分析如下:
初始條件定義,給定一個list集合:

List<Integer> list=Arrays.asList(10,11,12,13,14,15);

match操作

boolean flag=list.stream().allMatch((x)->x%2==0);
System.out.println(flag);
flag=list.stream().anyMatch((x)->x%2==0);
System.out.println(flag);
flag=list.stream().noneMatch((x)->x>20);
System.out.println(flag);

find操作

Optional<Integer> optional=list.stream().sorted().findFirst();
System.out.println(optional.get());
optional=list.parallelStream().filter((x)->x%2!=0).findAny();
System.out.println(optional.get());

count操作

long count=list.stream().count();
System.out.println(count);

求最大,最小值

optional=list.stream().max((x,y)->{return x-y;});
System.out.println(optional.get());
optional=list.stream().min((x,y)->{return x-y;});
System.out.println(optional.get());

forEach迭代操作

list.stream().forEach(System.out::println);

Reduce(規約)操作

//計算集合中所有元素的和,其中第一個引數0為初始值,然后與后面每個值累加

Integer sum=list.stream().reduce(0,(x,y)->{return x+y;});
System.out.println(sum);

Collector(收集)操作

List<Integer> result=list.stream().map(x->x*2).collect(Collectors.toList());
System.out.println(result);

list.stream().map(x->x*2).collect(Collectors.toSet());
System.out.println(result);

double avg=list.stream().collect(Collectors.averagingDouble(x->x));
System.out.println(avg);

Optional<Integer> max=list.stream().collect(Collectors.maxBy((x,y)->{return x-y;}));
System.out.println(max.get());

Map<Object,List<Integer>> map=list.stream().collect(Collectors.groupingBy(x->x%2==0));
System.out.println(map);

2.5 Stream練習

案例1:計算多個整數的和,

static void doTestReduce01() {
             List<Integer> list = Arrays.asList(1,2,3,4,5,6);
             Optional<Integer> count =
         list.stream().reduce((a, b) -> (a + b));
             System.out.println(count.get()); // 21
    }

案例2:計算多個整數乘機,然后再乘以2,

	static void doTestReduce02() {
	    List<Integer> list = Arrays.asList(1,2,3,4,5,6);
	    Integer count = list.stream().reduce(2, (a, b) -> (a * b));
	    System.out.println(count);  // 1440
	}

案例3:計算多個整數的和,假如超出范圍,則對其進行型別轉換,.
案例1和2的缺點在于回傳的資料都只能和 Stream 流中元素型別一致,但假如求和或乘積之后的數值超過了 Integer 能夠表示的范圍怎么辦?例如,需要使用 Long 型別接收,這就用到了我們下面reduce() 方法的應用形式了,

static void doTestReduce03() {
	List<Integer> list =Arrays.asList(Integer.MAX_VALUE, Integer.MAX_VALUE);
	long count =list.stream().reduce(0L, (a, b) -> (a + b), (a,b) -> 0L);
	System.out.println(count);
}

案例4:獲取指定目錄下所有目錄檔案的檔案名?

List<String> allDirNames =
	Arrays.stream(new File("d:\\")
    	.listFiles())
        .filter(File::isDirectory)
        .map(File::getName)
        .collect(Collectors.toList());
	System.out.println(allDirNames);

案例五:并行流的簡易應用,
并行流應用的目的主要借助多核處理器優勢,提高的操作性能,

public static void main (String[] args) {
	String[] strings =  {"1", "2", "3", "4", "5"};
	doPrint(Arrays.stream(strings).sequential());
	doPrint(Arrays.stream(strings).parallel());
}
public static void doPrint (Stream<String> stream) {
	stream.forEach(s -> {
		System.out.println(
		Thread.currentThread().getName()+"->"+s);
	});
}

三、新日期物件應用

3.1 概述

在Java8之前,日期和時間的管理一直是令Java開發者很痛苦的一個的問題,java.util.Datejava.util.CalendarSimpleDateFormat都一直沒有很好解決這個問題,故此,Java8引入了一套全新的日期時間處理API,新的API基于ISO標準日歷系統,解決了以前日期和時間類的很多弊端問題,

3.2 應用場景分析

Java8中的時間處理API定義在java.time包中,這些API具備不可變且執行緒安全特性,具備準確和靈活特性,所以現在基本可以使用這組API替換所有原有歷史版本中時間API的應用,

3.3 快速入門分析

3.3.1 常用API應用分析:

Instant 時間戳,默認是0時區,比北京少8個時區

3.3.2 Instant 基本應用

//獲取瞬時物件(當前時間年月日時分秒),Instant是絕對時間,沒有時區的概念
Instant instant1 ==Instant.now();//Clock.systemUTC().instant();
System.out.println(instant1);
//通過這種方式獲取的時間戳與北京時間相差8個時區,需要修正為北京時間
instant1=instant1.plusMillis(TimeUnit.HOURS.toMillis(8));;
//輸出系統可用時區
System.out.println(ZoneId.getAvailableZoneIds());

//輸出系統默認時區
System.out.println(ZoneId.systemDefault());

//輸出系統默認時區時間
System.out.println(Instant.now().atZone(ZoneId.systemDefault()));

獲取時間間隔

 Instant start = Instant.now();
...
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
System.out.println("Milliseconds: " + timeElapsed.toMillis());  

LocalDate 日期物件,不包含具體時間

LocalDate ld1=LocalDate.now();
System.out.println(ld1);
LocalDate ld2 = LocalDate.of(2019, Month.JANUARY, 8);
System.out.println(ld2);
LocalDate ld3=LocalDate.parse("2019-12-12");
System.out.println(ld3);

LocalTime 時間物件,不包含日期

LocalTime lt1=LocalTime.now();
System.out.println(lt1);
LocalTime lt2=LocalTime.now(ZoneId.systemDefault());
System.out.println(lt2);
long t=ChronoUnit.HOURS.between(lt1, lt2);
System.out.println(t);

LocalDateTime 包含了日期和時間物件,沒有時區資訊

LocalDateTime ldt02 =
LocalDateTime.of(2019, Month.DECEMBER, 31, 23, 59, 59);
System.out.println(ldt02);//2019-12-31T23:59:59
                
DayOfWeek dayOfWeek = ldt02.getDayOfWeek();
System.out.println(dayOfWeek);      // WEDNESDAY

ZoneDateTime 包含時區的完整日期時間物件,偏移量以UTC時間為基準

ZonedDateTime zdt01=ZonedDateTime.now();
System.out.println(zdt01);
ZoneId zd01=TimeZone.getDefault().toZoneId();
System.out.println(zd01);

3.4 應用案例增強分析

日期型別轉換

LocalDateTime ld4 =LocalDateTime.parse("2019/12/12 12:12:12",
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
System.out.println(ld4);

說明:jdk8之前的日期與字串之間的轉換通常會借助SimpleDateFormat物件,但是此物件執行緒不安全,通常要借助ThreadLocal物件,保證SimpleDateFormat物件每個執行緒一份;

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/254924.html

標籤:java

上一篇:服務負載均衡:Ribbon

下一篇:Java模擬實作一個基于文本界面的《客戶資訊管理軟體》

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more