天天看點

JAVA 8 In Action 讀書筆記 (二) : Stream

首先定義一個測試對象

//POJO, Person對象
public class Person {

    private String name;
    private int weight;


    public Person(String name, int weight) {
        super();
        this.name = name;
        this.weight = weight;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getWeight() {
        return weight;
    }
    public void setWeight(int weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return name+" : "+ weight +" KG ";
    }

    public boolean isOverweight() {
        return weight>;
    }

    @Override
    public boolean equals(Object target) {
        // TODO Auto-generated method stub
        return name.equals(((Person)target).getName());
    }
    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return name.hashCode();
    }
}
           

測試代碼

public class Demo {

    public static void main(String[] args) {
        List<Person> source = Arrays.asList(new Person("Li Lei", ), new Person("Li Lei", ),
                new Person("Han Meimei", ), new Person("Xiao wang", ), new Person("Xiao zhang", ));
        //原始資料列印
        System.out.println("原始資料列印 : ");
        source.stream().forEach(System.out::println);
        //Li Lei :  KG 
        //Li Lei :  KG 
        //Han Meimei :  KG 
        //Xiao wang :  KG 
        //Xiao zhang :  KG 

        // 用謂詞篩選 filter
        System.out.println("用謂詞篩選 : ");
        source.stream().filter(Person::isOverweight).forEach(System.out::println);
        //Li Lei :  KG 
        //Li Lei :  KG 
        //Xiao wang :  KG 

        // 篩選各異的元素 distinct
        System.out.println("篩選各異的元素: ");
        source.stream().filter(Person::isOverweight).distinct().forEach(System.out::println);
        //Li Lei :  KG 
        //Xiao wang :  KG 

        // 截短流 limit
        System.out.println("截短流: ");
        source.stream().filter(Person::isOverweight).distinct().limit().forEach(System.out::println);
        //Li Lei :  KG 

        // 跳過元素 skip
        System.out.println("跳過元素: ");
        source.stream().filter(Person::isOverweight).distinct().skip().forEach(System.out::println);
        //Xiao wang :  KG 

        // 排序 sorted
        System.out.println("根據體重排序: ");
        source.stream().sorted(Comparator.comparingInt(Person::getWeight)).forEach(System.out::println);
        //Xiao zhang :  KG 
        //Han Meimei :  KG 
        //Xiao wang :  KG 
        //Li Lei :  KG 
        //Li Lei :  KG 

        System.out.println("根據體重倒序并儲存到另外List中: ");
        List<Person> target = source.stream().sorted(Comparator.comparing(Person::getWeight).reversed()).collect(Collectors.toList());
        System.out.println(Arrays.toString(target.toArray()));
        //[Li Lei :  KG , Li Lei :  KG , Xiao wang :  KG , Han Meimei :  KG , Xiao zhang :  KG ]

        // 求總數count
        long count= source.stream().count();
        System.out.println("總數 : " +count);
        //總數 : 

        // 查找至少比對一個 anyMatch
        boolean result = source.stream().anyMatch(Person::isOverweight);
        System.out.println("查找至少比對一個(>80)的結果 : " + result);
        //查找至少比對一個(>)的結果 : true

        // 查找全部比對 allMatch
        boolean result2 = source.stream().allMatch(Person::isOverweight);
        System.out.println("查找全部比對(>80)的結果 : " + result2);
        //查找全部比對(>)的結果 : false

        // 查找沒有一個比對 noneMatch
        boolean result3 = source.stream().noneMatch(Person::isOverweight);
        System.out.println("查找沒有一個比對(>80)的結果 : " + result3);
        //查找沒有一個比對(>)的結果 : false

        // 查找元素 findAny findFirst (采用parallelStream 代替Stream,用來展示以下兩個方法在并行下傳回結果可能不同)
        System.out.println("查找任意滿足的一個元素 : " + result);
        source.parallelStream().filter(Person::isOverweight).findAny().ifPresent(System.out::println);
        System.out.println("查找第一個滿足的元素 : " + result);
        source.parallelStream().filter(Person::isOverweight).findFirst().ifPresent(System.out::println);
        //查找任意滿足的一個元素 : true
        //Xiao wang :  KG 
        //查找第一個滿足的元素 : true
        //Li Lei :  KG 

        // 映射 map
        System.out.println("映射: ");
        source.stream().filter(Person::isOverweight).distinct().map(Person::getName).forEach(System.out::println);
        //Li Lei
        //Xiao wang

        // 流的扁平化 flatmap
        System.out.println("輸出名字包含的單詞(不用flatmap): ");
        source.stream().filter(Person::isOverweight).distinct().map(person -> person.getName().split(" "))
                .forEach((String[] values) -> System.out.println(Arrays.toString(values)));
        // [Li, Lei]
        // [Xiao, wang]

        System.out.println("輸出名字包含的單詞(采用flatmap): ");
        source.stream().filter(Person::isOverweight).distinct().map(person -> person.getName().split(" "))
                .flatMap(Arrays::stream).forEach(System.out::println);
        //Li
        //Lei
        //Xiao
        //wang

        // 規約 reduce
        // 求和
        System.out.println("求和: ");
        source.parallelStream().mapToInt(Person::getWeight).reduce(Integer::sum).ifPresent(System.out::println);
        //

        // 最大值最小值
        System.out.println("最大值: ");
        source.parallelStream().mapToInt(Person::getWeight).reduce(Integer::max).ifPresent(System.out::println);
        //

        System.out.println("最小值: ");
        source.parallelStream().mapToInt(Person::getWeight).reduce(Integer::min).ifPresent(System.out::println);
        //

        //IntStream
        System.out.println("展示IntStream: ");
        IntStream.rangeClosed(, ).forEach(System.out::println);
        //
        //
        //
        //

        //檔案流
        System.out.println("從檔案中讀取流: ");
        //Stream<String> lines=Files.lines(Paths.get("d:/test.txt")
        try(Stream<String> lines=new BufferedReader(new InputStreamReader(Demo.class.getResourceAsStream("/test.txt"))).lines()){
            lines.forEach(System.out::println);
        }catch (Exception e) {
            e.printStackTrace();
        }
        //This is the first Line;
        //This is the Second Line;

    }

}
           

完整運作結果:

原始資料列印 :

Li Lei : 90 KG

Li Lei : 92 KG

Han Meimei : 60 KG

Xiao wang : 82 KG

Xiao zhang : 50 KG

用謂詞篩選 :

Li Lei : 90 KG

Li Lei : 92 KG

Xiao wang : 82 KG

篩選各異的元素:

Li Lei : 90 KG

Xiao wang : 82 KG

截短流:

Li Lei : 90 KG

跳過元素:

Xiao wang : 82 KG

根據體重排序:

Xiao zhang : 50 KG

Han Meimei : 60 KG

Xiao wang : 82 KG

Li Lei : 90 KG

Li Lei : 92 KG

根據體重倒序并儲存到另外List中:

[Li Lei : 92 KG , Li Lei : 90 KG , Xiao wang : 82 KG , Han Meimei : 60 KG , Xiao zhang : 50 KG ]

總數 : 5

查找至少比對一個(>80)的結果 : true

查找全部比對(>80)的結果 : false

查找沒有一個比對(>80)的結果 : false

查找任意滿足的一個元素 : true

Xiao wang : 82 KG

查找第一個滿足的元素 : true

Li Lei : 90 KG

映射:

Li Lei

Xiao wang

輸出名字包含的單詞(不用flatmap):

[Li, Lei]

[Xiao, wang]

輸出名字包含的單詞(采用flatmap):

Li

Lei

Xiao

wang

求和:

374

最大值:

92

最小值:

50

展示IntStream:

1

2

3

4

從檔案中讀取流:

This is the first Line;

This is the Second Line;

Github源碼

Eclipse工程源碼