17 - Stream流

本文介绍 Java 中 Stream API 的使用方法,包括如何从 Collection 和 Map 生成 Stream,以及如何使用 Stream 进行过滤、映射、排序等操作。此外,还介绍了如何利用收集方法将 Stream 处理后的数据收集到各种集合中。
摘要由CSDN通过智能技术生成

Stream流的生成方式

  • Collection体系的集合可以使用默认方法stream()生成流 default Stream stream()
  • Map体系的集合间接生成流
Map<String, Integer> map = new HashMap<>();
Stream<String> mapStream = map.keySet().stream();
Stream<Integer> mapstream = map.values().stream();
Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();
  • 数组可以通过Stream接口的静态方法`of(T…values)生成流
String[] arr = {"hello", "world", "java"};
Stream<String> arrStrem = Stream.of(arr);
Stream<String> arrstrem = Stream.of("hello", "world");
Stream<Integer> arrStrem2 = Stream.of(10, 20, 30);

Stream流常见的中间操作方法

  • Stream<T> filter(Predicate pre):用于对流中的数据进行过滤
    • Predicate接口中的方法为:boolean test(T t),判断,并返回一个布尔值
  • Stream<T> limit(long maxSize):返回此流中的元素组成的流,截取前指定参数个数的数据
  • Stream<T> skip(long n):跳过指定参数个数的数据,返回由该流的剩余元素组成的流
  • static <T> Stream<T> concat(Stream a, Stream b):合并a和b两个流为一个流
  • Stream<T> distinct():返回由该流的不同元素
  • Stream<T> sorted():返回由此流的元素组成的流,自然排序
  • Stream<T> sorted(Comparator com):返回由该刘的元素组成的流,根据提供的比较器排序
  • <R> Stream<R> map(Function mapper):返回由给定函数应用于此流的元素的结果组层的流
    • Function接口中的方法:R apply(T t)
  • IntStream mapToInt(ToIntFuction mapper):返回一个IntStream其中包含将给定函数应用于此流的元素的结果
    • IntStream:表示原始int流
    • ToIntFunction接口中的方法:int applyAsInt(T value)
arr.stream().filter(str->str.startsWith("J")).forEach(System.out::println);
arr.stream().limit(2).forEach(System.out::println);
arr.stream().skip(2).limit(1).forEach(System.out::println);
// -----------------------
arr.concat(s1, s2).distinct()
// 按照字母顺序输出       arr.stream().sorted().forEach(System.out::println);

// 按照字符串长度输出
arr.stream().sorted((s1, s2) -> {
    int num = s1.length() - s2.length();
    int res = num == 0 ? s1.compareTo(s2) : num;
    return res;
}).forEach(System.out::println);

// 将集合中的字符串转为int
list.stream().map(s->Integer.parseInt(s)).forEach(System.out::println);
list.stream().map(Integer::parseInt).forEach(System.out::println);
list.stream().mapToInt(Integer::parseInt).forEach(System.out::println);
//返回流中的总和
int sum = list.stream().mapToInt(Integer::parseInt).sum();
System.out.println(sum);

Stream流的收集操作

收集方法

  • R collect(Collector collector)
    工具类Collectors提供了具体收集方法
  • public static <T> Collector toList()
  • …toSet()
  • …toMap(Function keymapperm, Function valueMapper)
public class MystreamDemo6 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("林青霞");
        list.add("张敏");
        list.add("林心如");
        list.add("刘岩");
        list.add("林志玲");

        // 得到名字为三个字的流
        Stream<String> nameStream = list.stream().filter(name -> name.length() == 3);
        // 把流里的数据收集到集合
        List<String> names = nameStream.collect(Collectors.toList());
        System.out.println(names);

        Set<Integer> set = new HashSet<Integer>();
        set.add(33);
        set.add(29);
        set.add(26);
        set.add(30);
        set.add(40);

        // age > 30
        Stream<Integer> ageStream = set.stream().filter(age -> age > 30);
        Set<Integer> ages = ageStream.collect(Collectors.toSet());
        System.out.println(ages);

        String[] arr = {"林青霞,40","张敏,38","林志玲,41"};
        // age>40
        Stream<String> arrStream = Stream.of(arr).filter(str -> Integer.parseInt(str.split(",")[1]) > 40);
        //把上面的收集到map集合中
        Map<String, Integer> collect = arrStream.collect(Collectors.toMap(str -> str.split(",")[0], str -> Integer.parseInt(str.split(",")[1])));

        System.out.println(collect);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jayvee_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值