什么是Stream流?
是数据的渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据,流讲的是计算!”
注意:
1、Stream不会存储元素。
2、Stream不会改变源对象。相反,它会返回一个持有结果的新stream
3、Stream操作是延迟执行的。这意味着它们会等到需要结果的时候才执行。
创建流的三个步骤:
-
创建Stream:
一个数据源(集合、数组),获取一个流。 -
中间操作:
一个中间操作链,对数据源的数据进行处理。 -
终止操作:
一个终止操作,执行中间操作链,并产生结果。
1、创建Stream:(5种方式)
public class TestStreamAPI {
public static void main(String[] args) {
User u1 = new User(1,"a",21);
User u2 = new User(2,"b",22);
User u3 = new User(3,"c",23);
User u4 = new User(4,"d",24);
User u5 = new User(6,"e",25);
//集合就是存储数据
List<User> list = Arrays.asList(u1,u2,u3,u4,u5);
//创建Stream
//1、通过Collection系列集合提供的stream()或者parallelStream()
Stream<User> stream1 = list.stream();
//2、通过Arrays中的静态方法stream()获取数组流
Stream<User> stream2 = Arrays.stream(new User[10]);
//3、通过Stream类中的静态方法of()
Stream<String> stream3 = Stream.of("aa", "bb", "cc");
//4、创建无限流
//迭代
Stream<Integer> stream4 = Stream.iterate(0, (x) -> x + 2);
stream4.limit(10).forEach(System.out::println);
//生成
Stream.generate(() -> Math.random())
.limit(4)
.forEach(System.out::println);
}
}
2、中间操作:




规约:reduce(T identity,BinaryOperator) 可以将流中的元素反复结合起来,得到一个值。
List<Integer> list1 = Arrays.asList(1,2,3,4,5);
Integer sum = list1.stream().reduce(0, (x, y) -> x + y);
System.out.println(sum); //sum = 15
收集:collect 将流转换成其他形式。接收一个collector接口的实现类,用于给Stream中元素做汇总的方法
User u1 = new User(1, "a", 21);
User u2 = new User(2, "b", 22);
User u3 = new User(3, "c", 23);
User u4 = new User(4, "d", 24);
User u5 = new User(6, "e", 25);
//集合就是存储数据
List<User> list = Arrays.asList(u1, u2, u3, u4, u5);
List<String> collect = list.stream().map(User::getName).collect(Collectors.toList());
System.out.println(collect);
**************************************************
[a, b, c, d, e]
示例:User类自己创建
/**
* 题目要求:用一行代码实现下列需求:
* 有5个用户用下面条件筛选
* 1、ID必须为偶数
* 2、年龄必须大于23岁
* 3、用户名转为大写
* 4、用户名倒序
* 5、只输出一个用户
*/
public class TestStream {
public static void main(String[] args) {
User u1 = new User(1,"a",21);
User u2 = new User(2,"b",22);
User u3 = new User(3,"c",23);
User u4 = new User(4,"d",24);
User u5 = new User(6,"e",25);
//集合就是存储数据
List<User> list = Arrays.asList(u1,u2,u3,u4,u5);
//stream计算数据
list.stream()
.filter(user->{return user.getId()%2==0;})
.filter(user->{return user.getAge()>23;})
.map(user->{user.setName(user.getName().toUpperCase());
return user;})
.sorted((user1,user2)->{return user2.getName().compareTo(user1.getName());})
.limit(1)
.forEach(System.out::println);
}
}
****************************结果:****************************
User{id=6, name='E', age=25}
网友评论