關於JDK8中Stream API的常見使用方法

Stream API

​ 產生一個全新的流,和數據源沒有關係(數據源不受影響)

a)創建stream方式:

​ 1)collection 例如:new ArrayList<>().stream()

​ 2)數組 Arrays.stream()

​ 3)通過Stream類中的靜態方法of()

​ 4)創建無限流

//創建無線流 — 迭代方式
@Test
public void test1() {
	Stream<Integer> stream = Stream.iterate(0,(x) -> x+2);
	stream.limit(10).forEach(System.out::println);
}
//創建無線流  ——生成
	@Test
	public void test2() {
		Stream.generate(() ->Math.random()).limit(5).forEach(System.out::println);
	}

b)中間操作

​ 1)篩選與切片

filter——接收Lambda,從流中排除某些元素。

@Test
public void test3() {//stream有內部迭代
	//中間操作
	Stream<Employee> stream = emplpoyees.stream().filter((e) ->{
		System.out.println("開始執行判斷");
		return e.getAge()>35;
	});
	//終止操作:一次性執行全部內容,就是“惰性求值”。
	stream.forEach(System.out::println);
}

limit——截斷流,使其元素不超過給定數量

@Test
public void test3() {
	//中間操作
	Stream<Employee> stream = emplpoyees.stream().filter((e) ->{
		System.out.println("開始執行判斷");
		return e.getAge()>35;
	}).limit(1).forEach(System.out::println);//限制爲1條
}

skip(n)——跳過元素,例如集合中一共有五個元素,skip(2)就是跳過前兩個,留下後三個;若流中元素不足n個,則返回一個空流。與limit(n)互補

distinct——篩選(去重),通過流所生成的元素hashcode() 和equals()去除重複的元素

​ 2)映射(Map)

​ map——接收lambda,將元素轉換成其他形式或提取信息。接收一個函數作爲參數,該函數會被應用到每個元素上,並將其映射成一個新的元素。

​ flatMap——接收一個函數作爲參數,將流中的每個值都換成另一個流,然後把所有的流連接成一個流。

//映射
@Test
public void test4() {
	emplpoyees.stream().map(Employee::getName).forEach(System.out::println);
	}

​ 3)排序

​ sorted() :自然排序(Comparable)

@Test
	public void test5() {
		List<String> list1 = Arrays.asList("bbb","ccc","aaa","ddd");
		list1.stream().sorted().forEach(System.out::println);
	}

​ sorted(Comparator com):定製排序

c)終止操作

以下爲終止操作常用的各個方法:

​	allMatch

​	anyMatch

​	noneMatch

​	findFirst

​	findAny

​	count

​	max

​	min

d)規約

​ reduce(T identity,BinaryOperator) / reduce(BinaryOperator) 可以將流中元素反覆結合起來,得到一個值。

@Test
public void test1() {
	List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
	// T reduce(T identity, BinaryOperator<T> accumulator);
	Integer sum = list.stream().reduce(0, (x,y) -> x+y);
	System.out.println(sum);//55
    
    //需求:獲取員工類中的所有工資的總和(map-reduce規約實現)
    Optional<Double> op = emplpoyees.stream().map(Employee::getSarlary).reduce(Double::sum);
		System.out.println(op.get());
}

e)收集

​ collect——將流轉換爲其他形式。接收一個Collector接口的實現,用於給Stream中元素做彙總的方法

//需求:將員工類中的所有名字收集到集合list中
public void test2() {
    /**
    	Employee::getName(方法引用的第三種方式————類::實例方法名);實例方法就是非靜態方法
    	Collectors這是一個集合收集的工具類,裏邊包含了許多靜態方法
    */
	List<String> list = emplpoyees.stream().map(Employee::getName).collect(Collectors.toList());
	list.forEach(System.out::println);
}
//set實現上一個需求(set可以將員工集合中的重複名字的員工去重)
@Test
public void test3() {
	Set<String> set = emplpoyees.stream().map(Employee::getName).collect(Collectors.toSet());
	set.forEach(System.out::println);
}
//
@Test
public void test4() {
	Long count = emplpoyees.stream().collect(Collectors.counting());
	System.out.println(count);
	
	Double avg = emplpoyees.stream().collect(Collectors.averagingDouble(Employee::getSarlary));
	System.out.println(avg);
	
	Double sum = emplpoyees.stream().collect(Collectors.summingDouble(Employee::getSarlary));
	System.out.println(sum);
}

​ 收集方式除了以上這些之外還有,groupingBy(多級分組)、partitioningBy(分區)、joining(連接)等方法,可根據需求查詢API文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章