stream简单操作

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;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章