Java之Stream类

本文详细介绍了JavaStreamAPI的使用,包括如何获取Stream流对象,中间操作如过滤、限制、去重等,以及终结方法如forEach和收集操作,展示了Lambda表达式在简化集合操作中的强大作用。
摘要由CSDN通过智能技术生成

1.介绍

(1)Stream流
配合Lambda表达式,简化集合和数组的操作
(2)Stream流思想
流水线思想

2.获取Stream流对象

(1)集合获取流Stream流对象
使用Collection接口中的默认方法Stream<T> stream()
注:单值集合可以直接获取Stream流对象,键值对象是间接获取Stream流对象

        //单值集合获取Stream流对象
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.stream().forEach(s -> System.out.println(s));
        //键值集合获取Stream流对象
        Map<String, String> map = new HashMap<>();
        map.put("a", "1");
        map.put("b", "2");
        map.keySet().stream().forEach(s -> System.out.println(s));
        map.values().stream().forEach(s -> System.out.println(s));
        map.entrySet().stream().forEach(s -> System.out.println(s));

(2)数组获取Stream流对象
使用Arrays数组工具类中的静态方法Stream<T> stream(T[] array)

   		int[] arr = new int[]{1, 2, 3, 4, 5};
        Arrays.stream(arr).forEach(s -> System.out.println(s));

(3)零散的数据获取Stream流对象
使用Stream类中的静态方法Stream<T> of(T… values)

		Stream.of("a", "b", 9, "d", 3).forEach(s -> System.out.println(s));

3.Stream流中间操作方法

注:流对象已经被使用过,就不允许再次使用了;Stream流操作,不会修改源数据
(1)Stream<T> filter(Predicate<? super T> predicate)
用于对流中的数据进行过滤

		//打印集合中以"张"开头的字符串
        ArrayList<String> list = new ArrayList<>();
        list.add("王一");
        list.add("张二");
        list.add("张三");
        list.add("李四");
        list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s));

(2)Stream<T> limit(long maxSize)
获取前几个元素

		list.stream().limit(3).forEach(s -> System.out.println(s));

(3)Stream<T> skip(long n)
跳过前几个元素

		list.stream().skip(2).forEach(s -> System.out.println(s));

(4)Stream<T> distinct()
去除流中重复的元素(依赖hashCode和equals方法)

 		Stream<? extends Serializable> stream = Stream.of("s", "s", 3, "d", 3);
        stream.distinct().forEach(s -> System.out.println(s));

(5)Stream<T> concat(Stream a,Stream b)
合并a和b两个流为一个流

   		Stream<Integer> stream1 = Stream.of(1, 2, 3, 4, 5);
        Stream<? extends Serializable> stream2 = Stream.of("s", "s", 9, "d", 3);
        Stream.concat(stream1, stream2).forEach(s -> System.out.println(s));

4.终结方法

(1)void forEach(Consumer action)
对此流的每个元素执行遍历操作

(2)long count()
返回此流中的元素数

5.Stream流的收集操作

(1)R collect(Collector collector)
开始收集Stream流,指定收集器,把Stream流操作后的结果数据转回到集合

(2)Collectors工具类提供了具体的收集方式

  • Collector <T> toList() 把元素收集到List集合中
	     Stream<String> sa = Stream.of("sa", "sc", "sd", "d");
       	 List<String> list = sa.filter(s -> s.startsWith("s")).collect(Collectors.toList());
  • Collector <T> toSet() 把元素收集到Set集合中
		Stream<String> sa = Stream.of("sa", "sc", "sd", "d");
        Set<String> set = sa.filter(s -> s.startsWith("s")).collect(Collectors.toSet());
  • Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中
ArrayList<String> list = new ArrayList<>();
        list.add("张三,23");
        list.add("李四,24");
        list.add("王五,25");
        list.add("赵六,26");
        list.stream().filter(s -> Integer.parseInt(s.split(",")[1]) > 24)
                .collect(Collectors.toMap(s-> s.split(",")[0], s -> s.split(",")[1]))
                .forEach((k, v) -> System.out.println(k + " " + v));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码届艺术家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值