1.stream流的定义
Stream是数据渠道,用于操作数据源所生成的元素序列,它可以实现对集合的复杂操作,例如过滤、排序和映射等。 (1)集合是一种静态的数据结构,存储在内存中,而Stream是通过CPU来实现计算的(并不会存储数据) (2)Stream不会改变源对象,而是返回一个新的持有结果的Stream(不可变) (3)Stream流只能使用一次
2.stream流的使用
2.1 stream流的创建
@Test
public void testCreatingStream() {
//Stream流只能使用一次
//数组
String[] str = {"hello", "world"};
Arrays.stream(str).forEach(s -> System.out.println(s));
//单列集合
List<String> list = new ArrayList<>();
//数组转换成集合
Arrays.asList(str);
}
复制代码
2.2 stream流过滤filter
/**
* stream流过滤
*/
@Test
public void testFilter() throws ParseException {
List<User> users = new ArrayList<User>(10);
User user1 = new User().builder().id("id001").name("船长").age(23).gender("1").dob(DateUtils.parseDate("1999-10-23", YYYY_MM_DD)).build();
User user2 = new User().builder().id("id002").name("阿卡丽").age(16).gender("0").dob(DateUtils.parseDate("2006-10-23", YYYY_MM_DD)).build();
User user3 = new User().builder().id("id003").name("凯南").age(16).gender("1").dob(DateUtils.parseDate("2006-11-11", YYYY_MM_DD)).build();
User user4 = new User().builder().id("id004").name("沙皇").age(17).gender("1").dob(DateUtils.parseDate("2005-01-18", YYYY_MM_DD)).build();
User user5 = new User().builder().id("id005").name("妖姬").age(24).gender("0").dob(DateUtils.parseDate("1998-01-18", YYYY_MM_DD)).build();
User user6 = new User().builder().id("id006").name("剑魔").age(18).gender("1").dob(DateUtils.parseDate("2004-10-23", YYYY_MM_DD)).build();
User user7 = new User().builder().id("id007").name("猫咪").age(18).gender("0").dob(DateUtils.parseDate("2004-06-23", YYYY_MM_DD)).build();
User user8 = new User().builder().id("id008").name("青刚影").age(20).gender("0").dob(DateUtils.parseDate("2002-10-23", YYYY_MM_DD)).build();
User user9 = new User().builder().id("id009").name("盲僧").age(24).gender("1").dob(DateUtils.parseDate("1998-10-23", YYYY_MM_DD)).build();
User user10 = new User().builder().id("id010").name("露露").age(24).gender("0").dob(DateUtils.parseDate("1998-10-23", YYYY_MM_DD)).build();
users.add(user1);
users.add(user2);
users.add(user3);
users.add(user4);
users.add(user5);
users.add(user6);
users.add(user7);
users.add(user8);
users.add(user9);
users.add(user10);
//过滤年龄少于18岁的 使用stream流不用影响原list,使用collect收集器进行收集查找效果
List<User> collect = users.stream().filter(new Predicate<User>() {
@Override
public boolean test(User user) {
return user.getAge() >= 18;
}
}).collect(Collectors.toList());
//使用stream流不用影响原list
users.stream().forEach(user -> System.out.println(user));
System.out.println("----------------------------------------------");
collect.stream().forEach(user -> System.out.println(user));
}
复制代码
源码中关于filter的说明
/**
* Returns a stream consisting of the elements of this stream that match
* the given predicate.
*
* <p>This is an <a href="package-summary.html#StreamOps">intermediate
* operation</a>.
*
* @param predicate a <a href="package-summary.html#NonInterference">non-interfering</a>,
* <a href="package-summary.html#Statelessness">stateless</a>
* predicate to apply to each element to determine if it
* should be included
* @return the new stream
*/
Stream<T> filter(Predicate<? super T> predicate);
复制代码
User实体类
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private String id;
private String name;
private Integer age;
private String gender;
private Integer score;
private Date dob;
}
复制代码
2.3 stream流中的映射之list转换成map
/**
* stream流list转换Map
*/
@Test
public void testMap() throws ParseException {
List<User> users = new ArrayList<User>(10);
User user1 = new User().builder().id("id001").name("船长").age(23).gender("1").dob(DateUtils