java8新特性stream操作

Stream是Java8的一大亮点,是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的 聚合操作(aggregate operation)或者大批量数据操作。Stream API借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。同时,它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。所以说,Java8中首次出现的 java.util.stream是一个函数式语言+多核时代综合影响的产物。
一.针对不同数据结构如何转化成stream
public class Main {
    public static void main(String[] args) {
        //获取单个值的stream对象
        Stream stream = Stream.of("a", "b", "c");
        //针对数组类型获取stream对象
        String[] array = new String[]{"1", "2", "3"};
        stream = Stream.of(array);
        stream = Arrays.stream(array);
        //针对集合的操作
        List<String> list = Arrays.asList(array);
        stream = list.stream();
    }
二.Stream的使用
@Data
public class Person implements Serializable{
    public Person(String personId, String personName, int sex, double score) {
        this.personId = personId;
        this.personName = personName;
        this.sex = sex;
        this.score = score;
    }
    private String personId;
    private String personName;
    private int sex;
    private double score;
    private String remarks;
}
1.map:一对一映射,把inputStream的每个元素映射成outputStream的另外一个元素
 List<Integer> nums = Arrays.asList(1, 2, 3);
 List<Integer> squareNums = nums.stream().map(n -> n * n).collect(Collectors.toList());
 System.out.println(squareNums.toString());
结果:
 [1, 4, 9]
 
2.flatMap:一对多映射,将inputStream中的层级结构扁平化,就是将最底层元素抽出来放到一起
 List<Integer> nums1 = Arrays.asList(1, 2, 3);
 List<Integer> nums2 = Arrays.asList(4, 5, 6);
 List<Integer> nums3 = Arrays.asList(7, 8, 9);
 List<Integer> flatNums = Stream.of(nums1, nums2, nums3).flatMap((childList) ->      childList.stream()).collect(Collectors.toList());
 System.out.println(flatNums.toString());  
结果:
 [1, 2, 3, 4, 5, 6, 7, 8, 9]

3.filter:原始Stream进行某项测试,通过测试的元素被留下来生成一个新Stream
 Integer[] sixNums = {1, 2, 3, 4, 5, 6, 7, 8};
 Integer[] events = Stream.of(sixNums).filter(n -> n%2 == 0).toArray(Integer[]::new);
 System.out.println(Arrays.asList(events).toString());
结果:
 [2, 4, 6, 8]

4.forEach:terminal操作,没有返回值,personList本身的值会被改变
 Person personMing = new Person("123", "xiaoming", 1, 85);
 Person personHong = new Person("456", "xiaohong", 2, 59);
 Person personHua = new Person("789", "xiaohua", 2, 65);
 List<Person> personList = new ArrayList<>();
 personList.add(personMing);
 personList.add(personHong);
 personList.add(personHua);
 personList.stream().filter(person -> person.getScore() >= 60).forEach(person -> person.setRemarks("及格"));
 personList.stream().filter(person -> person.getScore() < 60).forEach(person -> person.setRemarks("不及格"));
 System.out.println(personList.toString());
结果:
 [Person(personId=123, personName=xiaoming, sex=1, score=85.0, remarks=及格), Person(personId=456, personName=xiaohong, sex=2, score=59.0, remarks=不及格), Person(personId=789, personName=xiaohua, sex=2, score=65.0, remarks=及格)]

5.peek是intermediate操作,有返回值,返回值为符合条件被赋值了的数据,personList本身的值也会被改变
 List<Person> newList = personList.stream().filter(person -> person.getScore() >= 60).peek(person ->  person.setRemarks("及格")).collect(Collectors.toList());
 System.out.println(newList.toString());
结果:
 [Person(personId=123, personName=xiaoming, sex=1, score=85.0, remarks=及格), Person(personId=789,   personName=xiaohua, sex=2, score=65.0, remarks=及格)]

6.reduce:将reduce后的第一个参数和Stream中的元素组合,求结果
 String[] str = {"A", "B", "C", "D"};
 String concatStr = Stream.of(str).reduce("F", String::concat);
 System.out.println(concatStr);

 Double[] doubles = {1.0, 2.0, 3.0, 4.0};
 double minValue = Stream.of(doubles).reduce(Double.MAX_VALUE, Double::min);
 System.out.println(minValue);

 Double sum = personList.stream().filter(person -> person.getScore() >= 60).collect(Collectors.summingDouble(Person::getScore));
 System.out.println(sum);
结果:
 FABCD
 1.0
 150.0

7.limit和skip: limit返回Stream的前面n个元素;skip则是扔掉前n个元素
 String[] name = personList.stream().map(Person::getPersonName).limit(2).skip(1).toArray(String[]::new);
 System.out.println(Arrays.asList(name).toString());
结果:
 [xiaohong]

8.sorted排序:默认升序,加reversed()降序
 List<Person> sortsList =  personList.stream().sorted(Comparator.comparing(Person::getScore).reversed()).collect(Collectors.toList());
 System.out.println(sortsList.toString());
结果:
 [Person(personId=123, personName=xiaoming, sex=1, score=85.0, remarks=及格), Person(personId=789, personName=xiaohua, sex=2, score=65.0, remarks=及格), Person(personId=456, personName=xiaohong, sex=2, score=59.0, remarks=不及格)]

9.Stream有三个match方法
 System.out.println("Stream有三个match方法");
 System.out.println("allMatch:Stream中全部元素符合,返回 true");
 boolean isAllExcellent = personList.stream().allMatch(p -> p.getScore() > 80);
 System.out.println(isAllExcellent);
 System.out.println("anyMatch:Stream中只要有一个元素符合,返回 true");
 boolean isThereAnyExcellent = personList.stream().anyMatch(p -> p.getScore() > 80);
 System.out.println(isThereAnyExcellent);
 System.out.println("noneMatch:Stream中没有一个元素符合,返回 true");
 boolean isThereNoneExcellent = personList.stream().noneMatch(p -> p.getScore() > 80);
 System.out.println(isThereNoneExcellent);
结果:
 allMatch:Stream中全部元素符合,返回 true
 false
 anyMatch:Stream中只要有一个元素符合,返回 true
 true
 noneMatch:Stream中没有一个元素符合,返回 true
 false


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

victor-维克特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值