Stream流(Java8)

  • Post author:
  • Post category:java

Stream流

1.流stream:保存对集合或数组数据的操作,和集合类似,但集合中保存的是数据

在这里插入图片描述
1.1 特点:

stream 自己不会存储元素
stream 不会改变源对象,相反,会返回一个持有结果的新stream
stream 操作是延迟执行的,意味着他们会等到需要结果的时候才执行

1.2 步骤:

1.创建
	新建一个流
2.中间操作
	在一个或多个步骤中,将初始stream转化到另一个stream的中间操作
3.终止操作
	使用一个终止操作来产生一个结果,该操作会强制它之前的延迟操作立即执行,之后,该stream就不能使用

1.3 获取stream对象的方式

通过collection对象的stream()或parallelStream()方法
通过Arrays类的stream()方法
通过Stream接口的of(),iterate(),generate()方法
通过Intstream,LongStream,DoubleStream接口中的of,range,rangeclosed方法

1.3.1 测试:
①、集合对象的stream和parallelStream

ArrayList<String> list = new ArrayList<>();
        list.add("theShy");
        list.add("MLXG");
        list.add("XiaoHu");
        list.add("Uzi");
        list.add("Ming");
        //1.集合流化后并遍历(串行流)
//        list.stream().forEach(s -> System.out.println(s));
        //2.集合流化后并遍历(并行流)
//        list.parallelStream().forEach(s -> System.out.println(s));

        //方法引用
//        list.stream().forEach(System.out::println);
//        list.parallelStream().forEach(System.out::println);

②、Arrays类的stream()方法

int[] arr={3,5,15,46,85,21,64};
        //1.数组流化 通过Arrays类的stream方法
//        Arrays.stream(arr).forEach(System.out::println);

③、通过Stream接口中的of(),iterate(),generate()方法

 //of方式
//        Stream<String> stream = Stream.of("U", "z", "i");
//        stream.forEach(System.out::println);
        //iterate方式
//        UnaryOperator<Integer> unaryOperator =x->x+10;
//        //seed :初始化元素
//        Stream<Integer> iterate = Stream.iterate(0, unaryOperator);
//        iterate.limit(10).forEach(System.out::println);
        //generator方式
        Supplier<Integer> i = ()->new Random().nextInt(100);
//        Stream.generate(i).limit(5).forEach(System.out::println);
        Stream.generate(()->new Random().nextInt(100)).limit(5).forEach(System.out::println);

④、通过Intstream,LongStream,DoubleStream接口中的of,range,rangeclosed方法

//startInclusive 初始值
        //endInclusive 上限
//       IntStream.rangeClosed(0,6).forEach(System.out::println);
//
//        //startInclusive 初始值
//        //endExclusive 上限
        LongStream.rangeClosed(0,5).forEach(System.out::println);

        //values: 传入元素制造新流
        DoubleStream.of(1,2,3,4,5,6).forEach(System.out::println);

中间操作,终止操作

中间操作

filter:过滤
limit:限制、截取
skip:跳过
distinct:去掉重复
sorted:排序
map:映射、调用这个函数后,可以改变返回的类型
parallel:采用多线程

终止操作

forEach:stream API 使用内部迭代(默认做了外部迭代)
max:返回流中最大值
min :返回流中最小值
count :返回流中元素总数
findAny(): 返回当前流中的任意元素
findFirst(): 返回第一个元素
reduce 归约: 可以将流中元素反复结合起来,得到一个值。返回 Optional
collect 收集: 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法

创建一个列表

public class Ganin {
    public static void main(String[] args) {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("Tom",24,"美国",'M'));
        list.add(new Person("Harley",22,"英国",'F'));
        list.add(new Person("向天笑",20,"中国",'M'));
        list.add(new Person("李康",22,"中国",'M'));
        list.add(new Person("欧阳雪",18,"中国",'F'));
        list.add(new Person("小梅",20,"中国",'F'));
        list.add(new Person("何雪",21,"中国",'F'));
        list.add(new Person("李康",22,"中国",'M'));


        //找到年龄大于20岁的人并输出 filter forEach
//        list.stream().filter((t)->t.getAge()>20).forEach(System.out::println);

        //找出所有中国人的数量 filter count
        //System.out.println(list.stream().filter(t -> t.getCountry().equals("中国")).count());

        //从Person列表中取出两个女性 filter limit
        //list.stream().filter(t->t.getSex()=='F').limit(2).forEach(System.out::println);

        //从Person列表中从第2个女性开始,取出所有的女性
        //list.stream().filter(t->t.getSex()=='F').skip(1).forEach(System.out::println);

        //distinct 去重
        //list.stream().distinct().forEach(System.out::println);

        //sorted 排序  按年龄排序,年龄相同则按姓名排序
        //list.stream().sorted((o,t)->o.getAge()==t.getAge()?o.getName().compareTo(t.getName()):o.getAge().compareTo(t.getAge())).forEach(System.out::println);

        //map 映射 得到信息
        list.stream().map(person -> person.getName()+":"+person.getCountry()).forEach(System.out::println);

		//max 条件年龄最大的
        Person person = list.stream().max((Person o, Person t) -> o.getAge().compareTo(t.getAge())).get();
        System.out.println(person);

    }
}

@AllArgsConstructor
@NoArgsConstructor
@Data
class Person{
    private String name;
    private Integer age;
    private String country;
    private char sex;
}

版权声明:本文为weixin_54517901原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。