1. 程式人生 > >java8--stream流API

java8--stream流API

生成資料流

使用Java8,Collection 介面有兩個方法來生成流。

  • stream() -返回順序流考慮集合作為其源。

  • parallelStream() - 返回並行資料流考慮集合作為其源

 

流/Stream是在JAVA8中引入的一個抽象,可以處理類似SQL語句宣告資料

示例程式碼1: StreamTest.java

package com.tingcream.java8.stream;
 
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
 
/**
 * rt.jar  java.util.stream 包
 * @author jelly
 *
 */
public class StreamTest {
     
    public static void main(String[] args) {
         
        System.out.println("集合中去除空元素");
        List<String> ss = Arrays.asList("abc", "", "bc", "efg", "abcd","", null,"jkl");
        //List<String>  list2=  list.stream().filter(s-> !s.isEmpty()).collect(Collectors.toList());
        List<String>  ss2=  ss.parallelStream().filter(s-> s!=null&&!s.isEmpty() ).collect(Collectors.toList());
        System.out.println(ss);//原list沒有改變
        System.out.println(ss2);
        System.out.println("==================");
         
        /*
         * stream() 返回一個流
         * parallelStream() 返回一個並行流
         * filter() 擷取子集
         * map()  將整個map中所有元素進行對映
         *  collect(Collectors.toList());  最終返回一個list
         * distinct()  去重
         * sorted() 指定排序規則
         * limit() 排序後取幾條資料
         * max().get() 取最大值
         * min().get() 取最小值
         * count() 取元素數量
         *
         * forEach() 對集合中元素進行遍歷處理,無返回值
         *
         * collect(Collectors.toList())
         * collect(Collectors.toSet())
         * collect(Collectors.toSet())
         * collect(Collectors.toCollection())
         * collect(Collectors.toMap())
         * collect(Collectors.toMap())
         * collect(Collectors.joining(", "))
         *
         */
         
        List<Integer> nums = Arrays.asList(3, 2, 2, 3, 7, 3, 5, 4);
        //get list of unique squares
        List<Integer> nums2 = nums.parallelStream().map( a-> a*a).distinct().collect(Collectors.toList());
         
        List<Integer> nums3 = nums.parallelStream().map( a-> (a-2)*2).distinct().collect(Collectors.toList());
        List<Integer> nums4 = nums.parallelStream().map( a-> (a-2)*2).distinct().sorted().limit(2).collect(Collectors.toList());
        List<Integer> nums5 = nums.parallelStream().map( a-> (a-2)*2).distinct().sorted((a,b)->b-a).limit(2).collect(Collectors.toList());
         
            Integer  max=     nums.parallelStream().map( a-> (a-2)*2).max((a,b)->a-b).get();//獲取最大值  10
            Integer  min=     nums.parallelStream().map( a-> (a-2)*2).min((a,b)->a-b).get();//獲取最小值  0
            long count =   nums.parallelStream().map( a-> (a-2)*2).distinct().count();//獲取集合元素數量 5
                  
              
        System.out.println(nums2);
         
        System.out.println(nums3);
        System.out.println(nums4);
        System.out.println(nums5);
        System.out.println(max);
        System.out.println(min);
        System.out.println(count);
//      nums.stream().map( a-> (a-2)*2).forEach(System.out::println);
        nums.stream().map( a-> (a-2)*2).forEach(a->System.out.print(a+","));
        System.out.println();
         
        //collect 收集器
        String mergedString = ss.parallelStream().filter(s-> s!=null&&!s.isEmpty()).collect(Collectors.joining(", "));
        System.out.println("Merged String: " + mergedString);
         
     
    }
 
}

示例程式碼2: StreamTest2.java 

package com.tingcream.java8.stream;
 
import java.util.Arrays;
import java.util.List;
 
public class StreamTest2 {
     
    public static void main(String[] args) {
         
        List<Double> numbers = Arrays.asList(3d, 2d, 2d, 3d, 7d, 3d, 5d,4d,10d);
 
    /*  DoubleSummaryStatistics stats = numbers.stream().mapToDouble(a->a).summaryStatistics();
         
        double   avg =   stats.getAverage();//平均值
        double max= stats.getMax(); //最大值
        double min= stats.getMin();//最小值
        double sum    =  stats.getSum();//總和
        long count = stats.getCount();//數量
         
        System.out.println("avg: "+avg);
        System.out.println("max: "+max);
        System.out.println("min: "+min);
        System.out.println("sum: "+sum);
        System.out.println("count: "+count);*/
         
       /*boolean b= numbers.parallelStream().anyMatch(a-> a>5);//      任何一個元素匹配了,則立即返回true
      boolean b2=   numbers.parallelStream().allMatch(a-> a>5);//      所有元素都匹配了,則返回true
      boolean b3= numbers.parallelStream().noneMatch(a-> a>5);// 所有元素都不匹配,則返回true
       System.out.println(b);
       System.out.println(b2);//false
       System.out.println(b3);//false
*/     
          
       double sum=  numbers.parallelStream().mapToDouble(a->a).sum();
       double avg=   numbers.parallelStream().mapToDouble(a->a).average().getAsDouble();
       long count =numbers.parallelStream().mapToDouble(a->a).distinct().count();
       double  max=numbers.parallelStream().mapToDouble(a->a).max().getAsDouble();
       double min=numbers.parallelStream().mapToDouble(a->a).min().getAsDouble();
        
        System.out.println("avg: "+avg);
        System.out.println("max: "+max);
        System.out.println("min: "+min);
        System.out.println("sum: "+sum);
        System.out.println("count: "+count);
    }
 
}