package com.xiangshuai.lambda; import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; /** * @author lqx * @ClassName StreamDemo1 * @description 参考网址 https://www.runoob.com/java/java8-streams.html * 一、Stream介绍: * Stream API是JDK8新添加的处理集合的关键组件,提供了多种的函数式操作。 引入全新的Stream API。这里的流Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同。 Stream是对集合对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者打批量数据操作。 只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母”等,Stream会隐式地在内部进行遍历,做出相应的数据转换。 Java有关List的stream基本操作 Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。 这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选、排序、聚合等。 和以前的collection操作不同,Stream操作还有两个基础的特征: Pipelining:中间操作都会返回流对象本身。这样多个操作可以串联成一个管道,如同流式风格。这样做可以对操作进行优化,比如延迟执行和短路。 内部迭代:以前对集合遍历都是通过Iterator或者ForEach的方式,显示的在集合外部进行迭代,这叫做外部迭代。Stream提供了内部迭代的方式,通过访问者模式实现。 一些方法: stream();为集合创建串行流。 parallelStream(),为集合创建并行流。是流并行处理程序的代替方法。 forEach(),Stream提供的新的方法来迭代流中的每个数据。 map(),方法用于映射每个元素到对应的结果。map(i -> i*i)集合中的每个元素变为平方 filter(),方法用于通过设置的条件过滤出元素,filter(string -> string.isEmpty()) 过滤出空字符串。 limit(),方法用于获取指定数量的流。limit(10) 获取10条数据 sorted(),方法用于对流进行排序。 collect(Collectors.toList()),用于返回列表或字符串,Collectors.joining(",");将集合转换成逗号隔开的字符串 二、Stream常见操作API介绍 1.聚合操作 2.stream的处理流程 2.1 获取数据源 2.1 数据转换 2.3 获取结果 3. 获取Stream对象 3.1 从集合或数组中获取 Collections.stream()如list.stream() Collections.parallelStream()如list.parallelStream() Arrays.stream() 3.2 BufferReader 3.3 静态工厂 java.util.stream..IntStream.range(, ) java.nio.file..Files.walk() 3.4 自定构建 java.util..Spliterator 3.5 更多的方式.. * @date 2020/6/21 16:33 */ public class StreamDemo1 { public static void main(String[] args) { //查filter()过滤出字符串大于10的集合元素 List<String> list=new ArrayList<>(); list.add("123");list.add("你好123");list.add("你好123---sssssssssss"); list.add("你好123---sssscccc"); list.add("你好123"); //先filter过滤后的stream用collect方法转成list list.stream().filter(str->str.length()>10).collect(Collectors.toList()); System.out.println(list); //map--将list里的对象id和对象弄成key,value List<Order> orders=new ArrayList<>(); StreamDemo1 streamDemo1 = new StreamDemo1(); orders.add(streamDemo1.new Order(1,"商品1")); orders.add(streamDemo1.new Order(2,"商品2")); orders.add(streamDemo1.new Order(3,"商品3")); // 第一个参数Order::getId 表示选择Order的getId作为map的key值; // 第二个参数v -> v表示选择将原来的对象作为map的value值; // 第三个参数(v1, v2) -> v1中,如果v1与v2的key值相同,选择v1作为那个key所对应的value值 Map<Integer, Order> collect = orders.stream().collect(Collectors.toMap(Order::getId, c -> c, (k1, k2) -> k2)); Set<Integer> integers = collect.keySet(); integers.stream().forEach(id->{ System.out.println(collect.get(id)); }); //将一个List对象的id用逗号连起来 String ids = orders.stream().map(Order::getId).map(String::valueOf).collect(Collectors.joining(",")); System.out.println(ids); } class Order{ private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public Order(int id, String name) { this.id = id; this.name = name; } public Order() { } @Override public String toString() { return "Order{" + "id=" + id + ", name='" + name + '\'' + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } } }
stream简单操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.