关于Stream和Collectors的用法,这应该是总结的最全的文章了,大家可以收藏一下。
一:简介
java.util.Stream 表示能应用在一组元素上一次执行的操作序列。Stream 操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,这样就可以将多个操作依次串起来。Stream 的创建需要指定一个数据源,比如 java.util.Collection的子类,List或者Set, Map不支持。Stream的操作可以串行stream()执行或者并行parallelStream()执行。
二:示例
forEach 循环
@Test
public void forEach(){
// 你不鸟我,我也不鸟你
List list = Arrays.asList("you", "don't", "bird", "me", ",",
"I", "don't", "bird", "you");
// 方式一:JDK1.8之前的循环方式
for (String item: list) {
System.out.println(item);
}
// 方式二:使用Stream的forEach方法
// void forEach(Consumer<? super T> action)
list.stream().forEach(item -> System.out.println(item));
// 方式三:方式二的简化方式
// 由于方法引用也属于函数式接口,所以方式二Lambda表达式也可以使用方法引用来代替
// 此种方式就是方式一、方式二的简写形式
list.stream().forEach(System.out::println);
}
filter 过滤
public class User {
private Long id;
private String phone;
private Integer age;
public User(){}
public User(Long id, String username, Integer age) {
this.id = id;
this.username = username;
this.age = age;
}
// Getter & Setter & toString
}
@Test
public void filter(){
List users = Arrays.asList(
new User(1L, "mengday", 28),
new User(2L, "guoguo", 18),
new User(3L, "liangliang", 17)
);
// Stream filter(Predicate<? super T> predicate);
users.stream().filter(user -> user.getAge() > 18).forEach(System.out::println);
}
map 映射
@Test
public void map(){
List list = Arrays.asList("how", "are", "you", "how", "old", "are", "you", "?");
// Stream map(Function<? super T, ? extends R> mapper);
list.stream().map(item -> item.toUpperCase()).forEach(System.out::println);
}
flatMap
@Test
public void flatMap(){
List a = Arrays.asList(1, 2, 3);
List b = Arrays.asList(4, 5, 6);
// Stream flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
List> collect = Stream.of(a, b).collect(Collectors.toList());
// [[1, 2, 3], [4, 5, 6]]
System.out.println(collect);
// 将多个集合中的元素合并成一个集合
List mergeList = Stream.of(a, b).flatMap(list -> list.stream()).collect(Collectors.toList());
// [1, 2, 3, 4, 5, 6]
System.out.println(mergeList);
// 通过Builder模式来构建
Stream