Java8-Stream流操作(二)

356 阅读2分钟

1、Collectors.collectingAndThen()

1.1 作用

Collectors.collectingAndThen() 函数应该最像 map and reduce 了,它可接受两个参数,第一个参数用于 reduce 操作,而第二参数用于 map 操作。 

也就是,先把流中的所有元素传递给第二个参数,然后把生成的集合传递给第一个参数来处理。 

例如下面的代码,先把 [1,2,3,4] 这个集合传递给 s-> ss lambda 表达式,计算得出结果为 [1,4,9,16] ,然后再把 [1,4,9,16] 传递给 v->v2 表达式,计算得出 [2,8,18,32] ,然后传递给 Collectors.averagingLong() 计算得到结果为 25.0 

1.2 代码示例

 

package com.xintu.java8;


import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class XinTuJava8CollectingAndThenExample {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        Double result = list.stream().collect(Collectors.collectingAndThen(Collectors.averagingLong(v -> v * 2),
                s -> s * s));
        System.out.println(result);
    }
} 

执行结果: 25.0

2、Collectors.joining()

2.1作用

Collectors.joining() 方法用某个指定的拼接字符串把所有元素拼接成一个字符串,并添加可选的前缀和后缀。

 

2.2 代码示例

 

package com.xintu.util.stream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class JoiningExamplepublic static void main(String[] args) { 
        List < String > list = Arrays.asList("A", "B", "C", "D"); 
        String result = list.stream().collect(Collectors.joining(",", "(", ")")); 
        System.out.println(result); 
    }
}

输出结果为 (A,B,C,D) 

3、Collectors.maxBy() 和 Collectors.minBy()

3.1 作用

两个方法分别用于计算流中所有元素的最大值和最小值。 

两个方法都可以接受一个比较器作为参数,用于如何计算最大值或最小值 

3.2 代码示例

 

package com.xintu.util.stream;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class MaxByMinByExample {
    public static void main(String[] args) {
        List < Integer > list = Arrays.asList(30, 10, 20, 35);
        //Get Max 
        list.stream().collect(Collectors.maxBy(new MaxByMinByExample().new IntegerComp()))
            .ifPresent(i - > System.out.println(i));
        //Get Min
        list.stream().collect(Collectors.minBy(new MaxByMinByExample().new IntegerComp()))
            .ifPresent(i - > System.out.println(i));
    }
    class IntegerComp implements Comparator < Integer > {@
        Override
        public int compare(Integer i1, Integer i2) {
            if (i1 >= i2) {
                return 1;
            } else {
                return -1;
            }
        }
    }
}

输出结果如下  3510  

4、 Collectors.summingInt()

4.1 作用

Collectors.summingInt() 方法将流中的所有元素视为 int 类型,并计算所有元素的总和 ( sum ) 

4.2 代码示例

package com.xintu.util.stream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class SummingIntExamplepublic static void main(String[] args) { 
        List < Integer > list = Arrays.asList(30, 10, 20, 35); 
        int result = list.stream().collect(Collectors.summingInt(i - > i)); 
        System.out.println(result); 
    }
}  

输出结果我为 95 

5、 Collectors.summingLong()

5.1 作用

Collectors.summingLong() 将流中的所有元素视为 long 类型,并计算所有元素的总和 .

5.2 代码示例

package com.xintu.java8;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class XInTuJava8SummingLongExample {
    public static void main(String[] args) {
        List<Long> list = new ArrayList<>();
        list.add((long) 340);
        list.add((long) 240);
        list.add((long) 360);
        long result = list.stream().collect(Collectors.summingLong(l -> l));
        System.out.println(result);
    }
}

执行结果: 1340 

6、 Collectors.summingDouble()

6.1 作用

Collectors.summingDouble() 将流中的所有元素视为 double 类型,并计算所有元素的总和 

6.2 代码示例

 

package com.xintu.java8;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class XinTuJava8SummingDoubleExample {
    public static void main(String[] args) {
        List<Double> list = Arrays.asList(140.5, 534.56, 772.76);
        Double result = list.stream().collect(Collectors.summingDouble(d -> d));
        System.out.println(result);
    }
}

执行结果:

1340

 

7、Collectors.counting()

7.1 作用

Collectors.counting() 用于统计流中元素的个数。 

7.2 代码示例

package com.xintu.java8;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class XinTuJava8CountingExample {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        long result = list.stream().collect(Collectors.counting());
        System.out.println(result);
    }
}

执行结果: 5