java流式Stream

96 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

传统方式

//将符合条件的放入新集合,可能多次循环
List<String> list = new ArrayList<>();
List<String> list2 = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("张丽丽");
for (String s : list) {
    if (s.startsWith("张")&&s.length()==3){
        list2.add(s);
    }
}
System.out.println(list2);

Stream流方式

list.stream().filter(name -> name.startsWith("张")).filter(name -> name.length() == 3).forEach(name -> System.out.println(name));
//结果  张丽丽

对多个元素进行操作时,考虑到性能和便利性,首先拼好一个"模型"步骤方案,然后执行

java.util.stream.Stream 是java8新加入的最常用的流接口。获取一个流非常简单,有以下几种常用方式:

  • 所有的collection 集合都可以通过stream默认方式获取流
  • Stream接口的镜头方法of 可以获取数组对应的流 1.获取流
    1)

default Stream<E> stream
返回以此集合作为源的顺序Stream
2) static <T> Stream<T>
返回其元素是指定值的顺序排序流

//把集合转成Stream流
List<String> list = new ArrayList<>();
Stream<String> s1 = list.stream();

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

Map<String,String> map = new HashMap<>();
//获取键,存储到一个Set集合
Set<String> keySet = map.keySet();
Stream<String> s3 =keySet.stream();
//获取值,存储到一个Collection集合
Collection<String> values = map.values();
Stream<String> s4 = values.stream();
//获取键值对
Set<Map.Entry<String ,String>> entries = map.entrySet();
Stream<Map.Entry<String,String>> s5 = entries.stream();

//把数组转成Stream流
Stream<Integer> s6 =Stream.of(1,2,3,4,5);
//可变参数传递数组
String[] arr = {"a","b","c"};
Stream<String> s7 = Stream.of(arr);

常用方法

  • 延迟方法:返回值类型仍然是stream接口类型,支持链式调用
  • 终结方法:返回值类型不再是stream接口类型,因此不再支持stringbuilder那样的链式操作。

foreach


Stream<String> stream = Stream.of("张三","李四","王五");
stream.forEach((String name) -> {
    System.out.println(name);
});
stream.forEach(name -> System.out.println(name));

filter


Stream<String> stream1 = stream.filter(name -> name.startsWith("张"));
stream1.forEach(name -> System.out.println(name));

map

Stream<String> stream = Stream.of("1","2","3");
Stream<Integer> integerStream = stream.map(s -> { return Integer.parseInt(s);});

count 统计元素个数 limit 取用前几个

Stream转回list或set (collect)

List<Integer> collect = stream.map(s -> {
    return Integer.parseInt(s);
}).collect(Collectors.toList());