美文网首页
Java:Stream

Java:Stream

作者: iOS_修心 | 来源:发表于2023-05-18 23:28 被阅读0次

一、Stream流的概述

stream流操作是Java 8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的 API和新增Stream操作

Stream流的三类方法
  • 获取Stream流
    • 创建一条流水线,并把数据放到流水线上准备进行操作
  • 中间方法
    • 流水线上的操作
    • 一次操作完毕之后,还可以继续进行其他操作
  • 终结方法
    • 一个Stream流只能有一个终结方法
    • 是流水线上的最后一个操作


二、常用方法

1、stream流创建

  1. Collection接口的stream()或parallelStream()方法;
  2. 静态的Stream.of()、Stream.empty()方法;
  3. Arrays.stream(array, from, to);
  4. 静态的Stream.generate()方法生成无限流,接受一个不包含引元的函数;
  5. 静态的Stream.iterate()方法生成无限流,接受一个种子值以及一个迭代函数;
  6. Pattern接口的splitAsStream(input)方法;
  7. 静态的Files.lines(path)、Files.lines(path, charSet)方法;
  8. 静态的Stream.concat()方法将两个流连接起来。
//Collection接口的stream()或parallelStream()方法;
List<String> list = new ArrayList<String>();
Stream<String> listStream = list.stream();

Set<String> set = new HashSet<String>();
Stream<String> setStream = set.stream();

//map可以分别获取Entry、key、value的Stream流
Map<String,Integer> map = new HashMap<String, Integer>();
Stream<String> keyStream = map.keySet().stream();
Stream<Integer> valueStream = map.values().stream();
Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();

//静态的Stream.of()、Stream.empty()方法;
Stream<Object> ofStream = Stream.of();
Stream<Object> emptyStream = Stream.empty();

//Arrays.stream(array, from, to);
IntStream intArrayStream = Arrays.stream(new int[]{1, 2, 3});

//静态的Stream.generate()方法生成无限流,接受一个不包含引元的函数;
Stream<Integer> generateStream = Stream.generate(new Random()::nextInt);

//静态的Stream.iterate()方法生成无限流,接受一个种子值(起始值)以及一个迭代函数(增长操作函数);
Stream<Integer> iterateStream = Stream.iterate(0, x -> x + 1).limit(4);

//Pattern接口的splitAsStream(input)方法;
Stream<String> patternStream = Pattern.compile("ll").splitAsStream("Hello");

try {
    //静态的Files.lines(path)、Files.lines(path, charSet)方法;
    Stream<String> fileStream = Files.lines(Paths.get("/"));
} catch (IOException e) {
    e.printStackTrace();
}

//静态的Stream.concat()方法将两个流连接起来。
Stream<Integer> concatStream = Stream.concat(generateStream, iterateStream);

2、Stream流中间操作

方法名 说明
Stream<T> filter(Predicate predicate) 用于对流中的数据进行过滤
Stream<T> limit(long maxSize) 返回此流中的元素组成的流,截取前指定参数个数的数据
Stream<T> skip(long n) 跳过指定参数个数的数据,返回由该流的剩余元素组成的流
static <T> Stream<T> concat(Stream a, Stream b) 合并a和b两个流为一个流
Stream<T> distinct() 返回由该流的不同元素(根据Object.equals(Object) )组成的流
Stream<T> sorted() 返回由此流的元素组成的流,根据自然顺序排序
Stream<T> sorted(Comparator comparator) 返回由该流的元素组成的流,根据提供的Comparator进行排序
<R> Stream<R> map(Function mapper) 返回由给定函数应用于此流的元素的结果组成的流

3、Stream流终结操

方法名 说明
void forEach(Consumer action) 对此流的每个元素执行操作
long count() 返回此流中的元素数
max() 返回此流中的最大值
min() 返回此流中的最小值

4、Stream流的收集操作

方法名 说明
R collect(Collector collector) 把结果收集到集合中
  • 工具类Collectors提供了具体的收集方式`

    方法名 说明
    public static <T> Collector toList() 把元素收集到List集合中
    public static <T> Collector toSet() 把元素收集到Set集合中
    public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中

三、实例

1、Stream流简化过程


ArrayList<String> list = new ArrayList<>();
list.add("张三丰");
list.add("张无忌");
list.add("张翠山");
list.add("王二麻子");
list.add("张良");
list.add("谢广坤");

//1.Predicate接口实现抽象方法test
list.stream().filter(
       new Predicate<String>() {
           @Override
           public boolean test(String s) {
               boolean result = s.startsWith("张");
               return result;
           }
       }
).forEach(s-> System.out.println(s));

//2.使用lambda表达式来简化
list.stream().filter(
       (String s)->{
           boolean result = s.startsWith("张");
               return result;
       }
).forEach(s-> System.out.println(s));
// 3. Stream流实现
list.stream().filter(s ->s.startsWith("张")).forEach(s-> System.out.println(s));

2、limit&skip& concat&distinct

//创建一个集合,存储多个字符串元素
ArrayList<String> list = new ArrayList<String>();
list.add("林青霞");
list.add("张曼玉");
list.add("王祖贤");
list.add("柳岩");
list.add("张敏");
list.add("张无忌");

//需求1:取前4个数据组成一个流
Stream<String> s1 = list.stream().limit(4);

//需求2:跳过2个数据组成一个流
Stream<String> s2 = list.stream().skip(2);

//需求3:合并需求1和需求2得到的流,并把结果在控制台输出
// Stream.concat(s1,s2).forEach(s-> System.out.println(s));

//需求4:合并需求1和需求2得到的流,并把结果在控制台输出,要求字符串元素不能重复
Stream.concat(s1,s2).distinct().forEach(s-> System.out.println(s));

//需求5:返回所有姓张的
list.stream().map(s -> {
    return s.startsWith("张");
}).forEach(s-> System.out.println(s));

//需求6:进行排序
list.stream().sorted((o1, o2) -> o1.compareTo(o2) ).forEach(s-> System.out.println(s));

3、收集操作toSet& toList

ArrayList<Integer> list1 = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
  list1.add(i);
}
for (int i = 1; i <= 4; i++) {
  list1.add(10);
}

//filter负责过滤数据的.
//collect负责收集数据.
//获取流中剩余的数据,但是他不负责创建容器,也不负责把数据添加到容器中.
//Collectors.toList() : 在底层会创建一个List集合.并把所有的数据添加到List集合中.
List<Integer> list = list1.stream().filter(number -> number % 2 == 0)
      .collect(Collectors.toList());
System.out.println(list);

Set<Integer> set = list1.stream().filter(number -> number % 2 == 0)
      .collect(Collectors.toSet());
System.out.println(set);

4、收集操作toMap

ArrayList<String> list = new ArrayList<>();
list.add("张三,23");
list.add("李四,24");
list.add("王五,25");

// collect方法只能获取到流中剩余的每一个数据.
//在底层不能创建容器,也不能把数据添加到容器当中

//Collectors.toMap 创建一个map集合并将数据添加到集合当中
Map<String, Integer> map = list.stream().filter(
        // s 依次表示流中的每一个数据
        s -> {
            String[] split = s.split(",");
            int age = Integer.parseInt(split[1]);
            return age >= 24;
        }
).collect(Collectors.toMap(
        //第一个lambda表达式就是如何获取到Map中的键
        //第二个lambda表达式就是如何获取Map中的值
        s -> s.split(",")[0],
        s -> Integer.parseInt(s.split(",")[1]) )
);

System.out.println(map);

相关文章

网友评论

      本文标题:Java:Stream

      本文链接:https://www.haomeiwen.com/subject/slhesdtx.html