java8 Stream

流是什么

流是java API 的新成员,它允许你以声明的方式处理数据集合,可以把它看成遍历数据集的高级迭代器.此外,流还可以透明的并行处理,无需在写任何多线程代码了.流,用来处理数据

流简介

要讨论流,我们先谈谈集合,这是最容

和迭代器类似,流只能遍历一次.遍历完之后,我们就说这个流已经被消费掉了
例如:

 public static void main(String[] args) {
        List<String> list = Arrays.asList( "java8","in","action");
        Stream<String> stream = list.stream();
        stream.forEach(d -> System.out.println(d));
        stream.forEach(d -> System.out.println(d));
    }
//上述的代码会抛出**java.lang.IllegalStateException**

所以要记住,流只能消费一次.

内部迭代和外部迭代
使用Collection接口需要用户去做迭代(比如for-each),这成为外部迭代.相反,Stream库使用内部迭代–jvm帮你实现迭代,并且把得到的流存在了某个地方,你只要给出䘝函数说要干什么就可以了.


List<Person> list = new ArrayList<>();
        Person p = null;
        for(int i = 0 ; i< 10 ; i++){
            p = new Person();
            p.setAge(i);
            p.setName("xiaoming"+i);
            list.add(p);
        }
//stream 内部迭代
        List<String > names = list.stream()
                .map(m -> m.getName())
                .collect(Collectors.toList());

        System.out.println(names);

流操作

java.util.stream.Stream中的Stream接口定义了很多操作.他们可以分为两大类:中间操作终端操作.可以连接起来的操作成为中间操作,关闭流的操作成为终端操作.
中间操作:
filter
map
flatMap
limit
skip
sorted
distinct

终端操作
forEach
count
collect
allMatch
anyMatch
noneMatch
findFirst
findAny

使用硫

流的来分类: 数值流,来自文件和数据等多种来源的流,无限流

- 筛选

Streams 方法支持filter方法,该操作会接受一个谓词(一个返回boolean的函数)作为参数,并返回一个包括所有符合谓词的元素的流.

        List<Person> list = new ArrayList<>();
        Person person = null;
        for(int i = 0 ; i< 10 ; i++){
            person = new Person();
            person.setAge(i);
            person.setName("xiaoming"+i);
            list.add(person);
        }

        List<Person > names = list.stream()
                .filter(p -> p.getAge() < 2)
                .collect(Collectors.toList());

        System.out.println(names);
  • 去重
    Streams 支持distinct 方法用来进行去重工作
List<Integer> numbers = Arrays.asList(1,2,3,4,5,3,2,4,6,6,4,8);
        numbers.stream()
                .filter(n -> n%2 == 0)
                .distinct()
                .forEach( n -> System.out.println(n));

            打印结果:2,4,6,8
  • 截取
    流支持limit(long)
//        截取操作
        List<Integer> nums = Arrays.asList(1,3,4,5,2,4,5);
        nums.stream()
                .filter(n -> n>3)
                .limit(2)
                .forEach(n-> System.out.println(n));
                //输出结果4,5
  • 跳过元素
    流支持skip(long),跳过前面n个元素
/*跳过元素*/
            List<Integer> nums = Arrays.asList(1,3,4,5,6,6);
            nums.stream()
                    .filter(n -> n > 3)
                    .skip(3)
                    .forEach(n -> System.out.println(n));
  • 映射
    map()
 List<String> strs = Arrays.asList("caoyulong","huzhuohui","love");
            strs.stream()
                    .map(String::length)
                    .forEach(i -> System.out.println(i));
//输出结果 9,9,4
  • 合并映射
    flatMap():生成的单个流和合并成一个流
  String[] strs = {"hello","world"};
            List<String> strList = Arrays.asList(strs);
            strList.stream()
                    .map(w -> w.split(""))
                    .flatMap(Arrays::stream)
                    .distinct()
                    .forEach(c -> System.out.print(c));
//输出结果:helowrd
  • 匹配
    anyMatch allMatch
List<Person> list = new ArrayList<>();
       Person person = null;
       for(int i = 0 ; i < 10 ; i++){
            person = new Person();
            person.setName("caoyulong"+i);
            person.setAge(i*10);
            list.add(person);
       }

        System.out.println(list);
           Boolean hasPerson = list.stream()
                   .anyMatch(p -> 0 == p.getAge());

        if (hasPerson){
            System.out.println("存在需要的person");
        }else{
            System.out.println("不存在需要的person");
        }

findAny findFirst

List<Person> list = new ArrayList<>();
        Person person = null;
        for(int i = 0 ; i < 10 ; i++){
            person = new Person();
            person.setName("caoyulong"+i);
            person.setAge(i*10);
            list.add(person);
        }

        Optional<Person> res = list.stream()
                .filter(p -> p.getAge() > 30)
                .findAny();
        System.out.println(res);
  • 归纳
    reduce
    求和
List<Integer> nums = Arrays.asList(1,34,5,5,7);
       int res = nums.stream()
               .map(num -> num * num)
               .reduce(0,(a,b) ->a+b);
        System.out.println(res);

求积

//求乘积
      List<Long> nums = Arrays.asList(1L,34L,5L,5L,7L);
        Long res = nums.stream()
                .map(n -> n*2)
                .reduce(1L,(a,b) -> a*b);
        System.out.println(res);
Java 8引入了Stream API,它是一种处理集合数据的新方式。Stream API提供了一种流式操作的方式,可以对集合进行过滤、映射、排序、聚合等操作,使得代码更加简洁、易读和高效。 Stream是一个来自数据源的元素队列并支持聚合操作。它可以是集合、数组、I/O channel、产生器等。Stream操作可以顺序执行,也可以并行执行。 Java 8 Stream API的特点包括: 1. 延迟执行:Stream操作通常是延迟执行的,只有在终止操作时才会触发实际的计算。 2. 内部迭代:Stream API使用内部迭代的方式,不需要显式地编写循环,使得代码更加简洁。 3. 函数式编程:Stream API支持函数式编程风格,可以通过Lambda表达式来定义操作。 4. 并行处理:Stream API提供了并行处理的能力,可以充分利用多核处理器的优势,提高处理速度。 使用Stream API可以通过一系列的中间操作和终止操作来对集合进行处理。中间操作包括过滤、映射、排序等操作,终止操作包括聚合、收集、遍历等操作。 下面是一些常用的Stream操作方法: 1. filter(Predicate<T> predicate):根据指定条件过滤元素。 2. map(Function<T, R> mapper):将元素进行映射转换。 3. sorted(Comparator<T> comparator):对元素进行排序。 4. distinct():去除重复的元素。 5. limit(long maxSize):限制元素的数量。 6. skip(long n):跳过指定数量的元素。 7. forEach(Consumer<T> action):对每个元素执行指定操作。 8. collect(Collector<T, A, R> collector):将元素收集到集合中。 9. reduce(BinaryOperator<T> accumulator):对元素进行归约操作。 10. parallel():启用并行处理。 以上只是Stream API的一部分常用操作,还有更多的操作方法可以根据具体需求使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值