java8-stream 常用操作

176 阅读2分钟

java8-stream操作

java 8 stream 流的操作总是记不住,每次都忘,需要每次百度,这次索性都记录下来,并将常用的网站也放在这里,已供以后学习工作使用

stream 简单介绍

Stream是Java 8 API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合(侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式)

Stream流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算,能让代码更加简洁,极大地简化了集合的处理操作,提高了开发的效率和生产力

Stream API 借助于同样新出现的 Lambda 表达式,而且使用并发模式,极大的提高编程效率和程序可读性。

Stream流其实就相当于是工厂上的流水线,后面会对数据更好的进行操作,如打印,过滤等等。说到底把它比作是工厂上的流水线还是很形象的。

常用的stream流实操网站

www.yuque.com/liyufei/ia5…

blog.csdn.net/qq_42003527…

具体实践

创建手机类

@Data
@AllArgsConstructor
public class Phone {
​
    private String name;
​
    private String brand;
​
    private Integer price;
}

开始常用stream操作:

public class StreamService {
​
    static List<Phone> list = new ArrayList<>();
​
    static {
        list.add(new Phone("小米 13", "xiaomi", 4599));
        list.add(new Phone("小米 12", "xiaomi", 2099));
        list.add(new Phone("苹果 14", "apple", 5399));
        list.add(new Phone("苹果 13", "apple", 2399));
        list.add(new Phone("华为 P60", "huawei", 4488));
        list.add(new Phone("华为 P40", "huawei", 2088));
        list.add(new Phone("vivo X90", "vivo", 2699));
    }
​
    public static void main(String[] args) {
        // 找出价格大于3000的手机,有三个
        List<Phone> collectFilter = list.stream().filter(phone -> phone.getPrice() > 3000).collect(Collectors.toList());
        collectFilter.stream().forEach(System.out::print);
​
        // 取所有的手机名称
        List<String> collect = list.stream().map(Phone::getName).collect(Collectors.toList());
​
        // 判断是否有手机的价格超过8000
        boolean b = list.stream().allMatch(phone -> phone.getPrice() > 8000);
​
        // 取最贵的一台手机
        Phone phone = list.stream().max(Comparator.comparing(Phone::getPrice)).get();
        Phone phone1 = list.stream().collect(maxBy(Comparator.comparingInt(Phone::getPrice))).get();
​
        // 取每种品牌中最贵的一台手机
        ArrayList<Phone> arrayList = list.stream().sorted(Comparator.comparing(Phone::getPrice).reversed())
                .collect(collectingAndThen(toCollection(() -> new TreeSet<>(Comparator.comparing(Phone::getBrand))), ArrayList::new));
​
        // 取所有手机的价格总和
        Integer sum1 = list.stream().map(Phone::getPrice).reduce(Integer::sum).get();
        Integer sum2 = list.stream().collect(summingInt(Phone::getPrice));
​
        // 取最贵的手机价格
        Integer max = list.stream().map(Phone::getPrice).reduce(Integer::max).get();
​
        // 取所有手机价格平均值
        Double collect1 = list.stream().collect(averagingInt(Phone::getPrice));
​
        // 取所有手机价格的最大值,最小值,总和等信息
        IntSummaryStatistics collect2 = list.stream().collect(summarizingInt(Phone::getPrice));
​
        // 将所有手机名称已逗号分割成字符串
        String collect3 = list.stream().map(Phone::getName).collect(joining(","));
​
        // 根据品牌分组
        Map<String, List<Phone>> collect4 = list.stream().collect(groupingBy(Phone::getBrand));
​
        // 分组求和,求每种手机的价格总和
        Map<String, Integer> collect5 = list.stream().collect(groupingBy(Phone::getBrand, summingInt(Phone::getPrice)));
        
​
    }
}