流式编程基础内容解读

内容讲解:

介绍:

Stream相当于一个数据渠道,用于操作集合、数组等多种数据源所生成的元素序列

注意:

1、Stream 自己不会存储元素。

2、Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。

3、Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

Stream流步骤:

(1)创建 Stream:一个数据源(如:集合、数组),获取一个流;

(2)中间操作:一个中间操作链,对数据源的数据进行处理;

(3)终止操作(终端操作):一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用;

详细步骤及API解读:

步骤一:创建操作,Stream实例化

1)1)方式一:通过集合

Collection 接口被扩展,提供了两个获取流 的方法:

  • default Stream<E> stream() : 返回一个顺序流
  • default Stream<E> parallelStream() : 返回一个并行流

举例:Stream<Employee> stream = employees.stream();

2)方式二:通过数组

Arrays 的静态方法 stream() 可以获取数组流: 

  • static <T> Stream<T> stream(T[] array): 返回一个流

举例:

        IntStream stream = Arrays.stream(arr);

        Stream<Employee> stream = Arrays.stream(arr);

3)方式三:通过Stream的of()

可以调用Stream类静态方法 of(), 通过显示值创建一个 流。它可以接收任意数量的参数。

  • public static<T> Stream<T> of(T... values) : 返回一个流

4)方式四:创建无限流(了解,用得少)

可以使用静态方法 Stream.iterate() 和 Stream.generate(), 创建无限流

  • 迭代:public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) 
  • 生成:public static<T> Stream<T> generate(Supplier<T> s)

步骤二:中间操作

1)筛选与切片

  • filter(Predicate p):接收Lambda, 从流中排除某些元素

  • distinct():筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素

  • limit(long maxSize):截断流,使其元素不超过给定数量

  • skip(long n):跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n) 互补

2)映射

  • map(Function f):接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。

  • mapToDouble(ToDoubleFunction f):接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 DoubleStream。

  • mapToInt(ToIntFunction f):接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 IntStream

  • mapToLong(ToLongFunction f):接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 LongStream

  • flatMap(Function f):接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流

3)排序

  • sorted():产生一个新流,其中按自然顺序排序

  • sorted(Comparator com):产生一个新流,其中按比较器顺序排序

步骤三:终止操作

注意:流终止操作后,就不能再使用了

1)匹配与查找

  • allMatch(Predicate p):检查是否匹配所有元素

  • anyMatch(Predicate p):检查是否至少匹配一个元素

  • noneMatch(Predicate p):检查是否没有匹配所有元素

  • findFirst():返回第一个元素

  • findAny():返回当前流中的任意元素

  • count():返回流中元素总数

  • max(Comparator c):返回流中最大值

  • min(Comparator c):返回流中最小值

  • forEach(Consumer c):内部迭代

2)归约

  • reduce(T iden, BinaryOperator b):从初始值iden开始,将流中元素反复结合起来,得到一个值。返回 T

  • reduce(BinaryOperator b):可以将流中元素反复结合起来,得到一 个值。返回 Optional<T>

3)收集

  • collect(Collector c):将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法

试验demo:

要求:编写一个流式编程的demo

实际做法:找了一道流式编程的题目,使用代码进行8个问题的回答,实际代码如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class StreamDemo {

    private static List<Transaction> createTransactionList(){
        Trader trader1 = new Trader("wang", "北京");
        Trader trader2 = new Trader("li", "上海");
        Trader trader3 = new Trader("qian", "北京");

        List<Transaction> list = Arrays.asList(
                new Transaction(trader1,2011, 300),
                new Transaction(trader1, 2012, 1000),
                new Transaction(trader2, 2011, 400),
                new Transaction(trader2, 2012, 710),
                new Transaction(trader3, 2012, 700),
                new Transaction(trader3, 2012, 950)
        );

        return list;
    }

    //1. 找出 2011 年发生的所有交易, 并按交易额排序(从低到高)
    private static void test1(){
        List<Transaction> list = createTransactionList();
        list.stream()
                .filter((y) -> y.getYear() == 2011)
                .sorted((s1,s2) -> Integer.compare(s1.getValue(), s2.getValue()))
                .forEach(System.out::println);
    }

    //2. 交易员都在哪些不同的城市工作过
    private static void test2(){
        List<Transaction> list = createTransactionList();
        list.stream()
                .map((r) -> r.getTrader().getCity())
                .distinct()
                .forEach(System.out::println);
    }

    //3. 查找所有来自北京的交易员,并按姓名排序
    private static void test3(){
        List<Transaction> list = createTransactionList();
        list.stream()
                .map(Transaction::getTrader)
                .filter((n) -> n.getCity().equals("北京"))
                .distinct()
                .sorted((t1, t2) -> t1.getName().compareTo(t2.getName()))
                .forEach(System.out::println);
    }

    //4. 返回所有交易员的姓名字符串,按字母顺序排序
    private static void test4(){
        List<Transaction> list = createTransactionList();
        list.stream()
                .map((p) -> p.getTrader().getName())
                .distinct()
                .sorted(String::compareTo)
                .forEach(System.out::println);
    }

    //5. 有没有交易员是在北京工作的
    private static void test5(){
        List<Transaction> list = createTransactionList();
        list.stream()
                .map(Transaction::getTrader)
                .filter((p) -> p.getCity().equals("北京"))
                .distinct()
                .forEach(System.out::println);
    }

    //6. 打印生活在北京的交易员的所有交易额
    private static void test6(){
        List<Transaction> list = createTransactionList();
        Optional<Integer> t = list.stream()
                .filter((p) -> p.getTrader().getCity().equals("北京"))
                .map(Transaction::getValue)
                .reduce(Integer::sum);
        System.out.println(t.get());
    }

    //7. 所有交易中,最高的交易额是多少
    private static void test7(){
        List<Transaction> list = createTransactionList();
        Optional<Integer> optional = list.stream()
                .map(Transaction::getValue)
                .max(Integer::compare);
        System.out.println(optional.get());
    }

    //8. 找到交易额最小的交易
    private static void test8(){
        List<Transaction> list = createTransactionList();
        Optional<Transaction> first = list.stream()
                .sorted((s1, s2) -> Integer.compare(s1.getValue(), s2.getValue()))
                .findFirst();
        System.out.println(first.get());
    }

    public static void main(String[] args) {
        test8();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值