java8-stream操作
java 8 stream 流的操作总是记不住,每次都忘,需要每次百度,这次索性都记录下来,并将常用的网站也放在这里,已供以后学习工作使用
stream 简单介绍
Stream是Java 8 API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合(侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式)
Stream流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算,能让代码更加简洁,极大地简化了集合的处理操作,提高了开发的效率和生产力
Stream API 借助于同样新出现的 Lambda 表达式,而且使用并发模式,极大的提高编程效率和程序可读性。
Stream流其实就相当于是工厂上的流水线,后面会对数据更好的进行操作,如打印,过滤等等。说到底把它比作是工厂上的流水线还是很形象的。
常用的stream流实操网站
具体实践
创建手机类
@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))); } }