Java8-Stream-終止操做-歸約與收集

歸約(reduce)

    將流中的元素依次結合起來,獲得一個新的值java

    三個重載的方法:併發

    1.Optional<T> reduce(BinaryOperator<T> accumulator);ide

    2.T reduce(T identity, BinaryOperator<T> accumulator)函數

  3.<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);spa

    前面兩種在下面有些例子介紹,可是第三種研究了半天也沒搞懂意思,在查閱資料後發現,它是用在流併發操做的時候,將每一個線程前兩個參數造成的結果result集合併爲一個。因此第三個參數是一個BinaryOperator函數接口線程

//歸約
	@Test
	public void test5() {
		//reduce(String identity, BinaryOperator<String> accumulator) 第一個參數至關於起始值 ,第二個參數是二元運算函數接口
		String s1 = custs.stream().map(Cust::getCustName).reduce("", (x,y)->x+","+y).replaceFirst(",", "");
		System.out.println(s1);
		
		System.out.println("###################################");
		//reduce(BinaryOperator<String> accumulator) 參數是二元運算函數接口,由於沒有給默認值,因此爲了不使用時空指針異常,返回的是Optional
		Optional<String> opt = custs.stream().map(Cust::getCustName).reduce((x,y)->x+","+y);
		String s2 = opt.get().replaceFirst(",", "");
		/*
		 * 從年齡大於40的人中去操做,filter的結果會爲空
		 * Optional<String> opt1 = custs.stream().filter((x)->x.getAge()>40).map(Cust::getCustName).reduce((x,y)->x+","+y);
		 * String s3 = opt1.get().replaceFirst(",", "");
		 * 
		 * 這段代碼要返回異常:java.util.NoSuchElementException: No value present
		 * 彷彿並無多大用處似的,看來須要再去了解一下Optional的使用方法
		 */
		
	}

收集

將數據源通過過濾、篩選等操做收集到對應的集合或者Map,或者收集他們的統計信息,如求和、平均值、最大值、最小值、記錄數等指針

圖片來自別人的教材code

開始寫例子。。接口

@Test
	public void test6() {
		List<Integer> cl1 = custs.stream().map(Cust::getCustId).collect(Collectors.toList());
		System.out.println(cl1);
		
		System.out.println("###############################");
		//若是收集爲SET,則具備排重功能
		Set<Integer> st1 = custs.stream().map(Cust::getCustId).collect(Collectors.toSet());
		System.out.println(st1);
		
		System.out.println("###############################");
		//使用時注意不能有重複的值
		Map<String,Integer> m1 = custs.stream().distinct().collect(Collectors.toMap((x)->x.getCustName(), (x)->x.getAge()));
		System.out.println(m1);
		//這個重載的方法比上面多出來的參數是用來處理衝突數據
		Map<String,Integer> m2 = custs.stream().collect(Collectors.toMap((x)->x.getCustName(), (x)->x.getAge(), (x,y)->x*y));
		System.out.println(m2);
		//在上面方法基礎上,還能夠把其餘Map中的數據合併到結果中
		Map<String,Integer> m3 = custs.stream().collect(Collectors.toMap((x)->x.getCustName(), (x)->x.getAge(), (x,y)->x*y,()->{
			Map<String,Integer> mt = new HashMap();
			mt.put("武磊", 2600000);
			mt.put("郜林", 2200000);
			return mt;
		}));
		System.out.println(m3);
		
		System.out.println("###############################");
		//toConcurrentMap用來併發開發當中,其餘2個和toMap用法一致,若是在併發開發中推薦使用toConcurrentMap,效率更高
		ConcurrentMap<String,Integer> m4 = custs.stream().distinct().collect(Collectors.toConcurrentMap((x)->x.getCustName(), (x)->x.getAge()));
		System.out.println(m4);
		
		//將結果收集到想要的集合當中
		LinkedList<String> ll1 = custs.stream().map(Cust::getCustName).limit(3).distinct().collect(Collectors.toCollection(LinkedList::new));
		System.out.println(ll1);
		
		//統計記錄數-至關於Oracle的count
		Long lc = custs.stream().collect(Collectors.counting());
		System.out.println(lc);
		
		//統計全部記錄的年齡-至關於Oracle的sum
		Long ls = custs.stream().collect(Collectors.summingLong(x->x.getAge()));
		System.out.println(ls);
		
		//求全部記錄的年齡的平均值,由於通過除法以後會變成Double,因此即便方式使Long類型,其返回結果是Double
		Double ls1 = custs.stream().collect(Collectors.averagingLong(x->x.getAge()));
		System.out.println(ls1);
		
		//收集統計信息---這個功能包含了經常使用的統計結果,使用起來很方便,可是若是源數據不少,且使用不到那麼多統計結果的話,爲了考慮程序效率,仍是要什麼用什麼比較好
		DoubleSummaryStatistics dss = custs.stream().collect(Collectors.summarizingDouble(x->x.getAge()));
		System.out.println(dss.getAverage()+","+dss.getCount()+","+dss.getMax());
		
	}

夜已深,瞌睡來了,剩下幾個方法,如分組、分區、鏈接等下次來寫圖片

相關文章
相關標籤/搜索