Java 8 流的新类 java.util.stream.Collectors 实现了 java.util.stream.Collector 接口,同时又提供了大量的方法对流 ( stream ) 的元素执行 map 和reduce 操作,或者统计操作。
1、 Collectors.toList()
1.1 作用
Collectors.toList() 将流中的所有元素导出到一个新的列表 ( List ) 中。
1.2 代码示例
package com.xintu.java8;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class XinTuJava8ListExample {
public static void main(String[] args) {
//将流中的所有元素导出到一个新的列表 ( List ) 中
List<String> list = Stream.of("A", "B", "C").collect(Collectors.toList());
list.forEach(s -> System.out.println(s));
}
}
执行结果:
ABC
D
2、 Collectors.toSet()
2.1 作用
Collectors.toSet() 把流中的所有元素导出到一个集合 ( Set ) 中,并排除重复的元素。
2.2 代码示例
package com.xintu.java8;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class XinTuJava8SetExample {
public static void main(String[] args) {
Set<String> set = Stream.of("A", "B", "C", "D","A").collect(Collectors.toSet());
set.forEach(s -> System.out.println(s));
}
}
执行结果:
A
B
C
D
3、 Collectors.toMap()
3.1 作用
Collectors.toMap() 将流中的所有元素导出到一个哈希表 ( Map ) 中。该方法接受两个参数,第一个参数用于生成键 ( key ) ,第二个参数用于生成值 ( value )。两个参数都是 Lambda 表达式。
3.2 代码示例
package com.xintu.java8;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class XinTuJava8MapExample {
public static void main(String[] args) {
Map<String, String> map = Stream.of("A", "B", "C", "D").collect(Collectors.toMap(k -> k, v -> v + v));
map.forEach((k, v) -> System.out.println("key:" + k + " value:" + v));
}
}
执行结果:
key:A value:AA
key:B value:BB
key:C value:CC
key:D value:DD
4、Collectors.mapping()
4.1 作用
Collectors.mapping() 一般用于多重 map and reduce 中。 Java 文档中描述的原型如下
mapping(Function<? super T,? extends U> mapper, Collector<? super U,A,R> downstream)
第一个参数用于 map ,第二个参数用于 reduce。
4.2 代码示例
package com.xintu.java8;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class XInTuJava8MappingDemo {
public static void main(String[] args) {
List<Person> list = Person.getList();
Map<Integer, String> nameByAge
= list.stream().collect(Collectors.groupingBy(Person::getAge,
Collectors.mapping(Person::getName, Collectors.joining(","))));
nameByAge.forEach((k, v) -> System.out.println("age:" + k + " persons: " + v));
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public static List<Person> getList() {
List<Person> list = new ArrayList<>();
list.add(new Person("Tom", 30));
list.add(new Person("Jack", 20));
list.add(new Person("LiSa", 20));
list.add(new Person("Mahesh", 30));
return list;
}
}
执行结果,
age:20 persons: Jack,LiSa
age:30 persons: Tom,Mahesh
5、Collectors.averagingDouble()
5.1 作用
Collectors.averagingDouble() 方法将流中的所有元素视为 double 类型并计算他们的平均值。该方法返回的是同一个 Collectors 实例,因此可以进行链式操作。
Collectors.averagingDouble() 接受一个参数,这个参数是一个 lambda 表达式,用于对所有的元素执行一个 map 操作。
Java 所有集合的 stream().collect() 可以接受一个收集器实例作为其参数并返回该收集器的计算结果。
例如下面的代码,collect() 方法会把所有的元素收集起来然后传递给 Collectors.averagingDouble(d->d*2) 收集器,对每个元素执行 *2 操作后计算平均值。
5.2 代码示例
package com.xintu.java8;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class XinTuJava8AveragingDoubleExample {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Double result = list.stream().collect(Collectors.averagingDouble(d -> d * 2));
System.out.println(result);
}
}
执行结果:
5.0
6、Collectors.averagingInt()
6.1 作用
Collectors.averagingInt() 方法和 Collectors.averagingDouble() 一样,不同的是它把流中的所有元素看成是 int 类型,并返回一个浮点类型的平均值。
6.2 代码示例
package com.xintu.java8;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class XinTuJava8AveragingIntExample {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Double result = list.stream().collect(Collectors.averagingInt(v -> v * 2));
System.out.println(result);
}
}
执行结果 5.0
7、Collectors.averagingLong()
7.1 作用
Collectors.averagingLong() 方法也和 Collectors.averagingDouble() 类似,不同的是它把流中的所有元素看成是 long 类型,并返回一个 double 类型的平均值。
7.2 代码示例
package com.xintu.java8;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class XinTuJava8AveragingLongExample {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Double result = list.stream().collect(Collectors.averagingLong(v -> v * 2));
System.out.println(result);
}
}
执行结果
5.0