在java中Stream是一个接口
流的迭代
创建流
一.直接创建
import java.util.stream.Stream;
Stream<String> stream = Stream.of("苹果", "哈密瓜", "香蕉", "西瓜", "火龙果");
二.由数组转化
String[] fruitArray = new String[] {"苹果", "哈密瓜", "香蕉", "西瓜", "火龙果"};
Stream<String> stream = Stream.of(fruitArray);
三.由集合转化
List<String> fruits = new ArrayList<>();
fruits.add("苹果");
fruits.add("哈密瓜");
fruits.add("香蕉");
fruits.add("西瓜");
fruits.add("火龙果");
Stream<String> stream = fruits.stream();
流的迭代也是由foreach()方法但和集合中的foreach不一样(遍历数据是一样的)
流数据过滤
filter()方法
功能为对流中的数据进行过滤
方法参数是一个Lambda表达式,箭头后是条件语句,判断数据需要符合的条件也就是使用Lambda表达式告诉过滤器,需要那些符合条件的数据
pupils.stream()
.filter(pupil -> pupil.getAverageScore() >= 80 && pupil.getViolationCount() < 1)
.forEach(pupil -> {System.out.println(pupil.getName());});
这里的Lambda表达式略有不同,因为是条件语句所以表达式放在()而不是{}中
流数据映射
流中的map()
方法就是映射,作用是用新的元素替换掉原来相同位置的元素,相当于每个对象都经历过依次转换
map()
方法的参数是一个Lambda表达式,在语句块中对流中的每个数据进行计算处理,最后return返回的对象就是转换后的对象
优点:
映射后的对象类型可以与原始的不一致提供了灵活性和扩展性
流数据排序
用Stream API实现学生学号排序:
List<Student> students = new ArrayList<Student>();
students.add(new Student(111, "bbbb", "london"));
students.add(new Student(131, "aaaa", "nyc"));
students.add(new Student(121, "cccc", "jaipur"));
students.stream()
// 实现升序排序
.sorted((student1, student2) -> {
return student1.getRollNo() - student2.getRollNo();
})
.forEach(System.out::println);
这里的
student1
指的是后一个元素,student2
是前一个元素
流数据的摘取
对一组数字找出最大的前3个数字
numbers.stream()
.sorted((n1, n2) -> n2 - n1)
.limit(3)
.forEach(System.out::println);
limit()
方法的作用就是返回流前n个元素,n不能为负数
不是摘取任意位置,只能是流开头
流的设计思想
数据流的操作过程可以看做一个管道,管道由多个节点组成,每个节点完成一个操作
数据流输入这个管道,按照顺序经过各个节点
Stream的显著特点是:编程的重点不再是对象的运用而是数据的计算
Stream的特征为:函数式风格,弱化了面向对象的严格,完整的语法重心变为通过函数完成数据计算