Stream API

朴灿烈づ我的快乐病毒、 2022-06-12 11:58 234阅读 0赞

以前对集合中元素进行操作的时候需要一个一个遍历的去做,找出符合条件的数据,这样做真的不要太繁琐= =。

sql中却有很强的筛选信息的能力,而且也可以返回你想要的结果。

借鉴于sql语句,Stream诞生了,Stream是集合包中新添加的一个类,

说它是集合呢,又不太像,因为Stream可以是无线的,可以看做是一个后面数据未知的集合吧。== 不好理解

打个比方,看电影,如果电影是被我们下载下来看的,就是集合,如果是在线看的,那么后面的数据其实你的电脑还是不知道的,就是Stream。

大概就是这么个意思吧。

Stream大概就这些个api

filter 过滤,类似于sql中的where, 条件的返回值应该是boolean类型的,真假是用来筛选的嘛。

distinct 去重复

skip 输入数字,跳过多少个

limit 限制输入,和数据库中一样

map 数据间的转换,T -> R,比如我们从一个对象集合中返回名字啊

sorted 排序,入参是个Comparator接口

anyMatch 是否存在一个以上满足条件的,返回boolean

allMatch 是否都满足条件

findAny 找到任何一个满足条件的,随便找,没有顺序,比找第一个会效率高

findFirst 找到第一个

forEach T ->void转换,一般用来打印或者存值啥的

collect 用什么方式收集数据,一般有list set map

reduce 用来求和取值的

count 计数

下面介绍一个例子,通过这个例子,大概都能了解吧

对交易员交易信息处理的例子:

实体类:

  1. public class Trader {
  2. private final String name;
  3. private final String city;
  4. public Trader(String n,String c){
  5. this.name=n;
  6. this.city=c;
  7. }
  8. public String getName() {
  9. return name;
  10. }
  11. public String getCity() {
  12. return city;
  13. }
  14. public String toString(){
  15. return "Trader:"+this.name+" in "+this.city;
  16. }
  17. }
  18. public class Transaction {
  19. private final Trader trader;
  20. private final int year;
  21. private final int value;
  22. public Transaction(Trader trader,int year,int value){
  23. this.trader=trader;
  24. this.year=year;
  25. this.value=value;
  26. }
  27. public int getYear() {
  28. return year;
  29. }
  30. public int getValue() {
  31. return value;
  32. }
  33. public Trader getTrader() {
  34. return trader;
  35. }
  36. public String toString(){
  37. return "("+this.trader+",year:"+this.year+","+"value:"+this.value+")";
  38. }
  39. }

先加一些数据:

  1. Trader raoul=new Trader("Taoul","Cambridge");
  2. Trader mario=new Trader("Mario","Milan");
  3. Trader alan=new Trader("Alan","Cambridge");
  4. Trader brian=new Trader("Brian","Cambridge");
  5. List<Transaction> transactions= Arrays.asList(
  6. new Transaction(brian,2011,300),
  7. new Transaction(raoul,2012,1000),
  8. new Transaction(raoul,2011,400),
  9. new Transaction(mario,2012,710),
  10. new Transaction(mario,2012,700),
  11. new Transaction(alan,2012,950)
  12. );

1找出2011年发生的所有交易,并按交易额排序:

  1. List<Transaction> tr2011=
  2. transactions.stream()//转化为流
  3. .filter(transaction -> transaction.getYear()==2011)//筛选出返回true的结果
  4. .sorted(Comparator.comparing(Transaction::getValue))//排序
  5. .collect(Collectors.toList());//用List收集
  6. System.out.println(tr2011);

2交易员都在哪些不同的城市工作过?

  1. List<String> cities=
  2. transactions.stream()
  3. .map(transaction -> transaction.getTrader().getCity())//信息转化啦,把对象变成城市的字符串
  4. .distinct()//去掉重复
  5. .collect(Collectors.toList());
  6. System.out.println(cities);

Set可以自动去重复,大家都懂的- -

  1. Set<String> cities2=
  2. transactions.stream()
  3. .map(transaction -> transaction.getTrader().getCity())
  4. .collect(Collectors.toSet());
  5. System.out.println(cities2);

3查找所有来自剑桥的交易员,并按名字排序:

  1. List<Trader> traders=
  2. transactions.stream()
  3. .map(Transaction::getTrader)//转换成交易员信息
  4. .filter(trader -> trader.getCity().equals("Cambridge"))//筛选
  5. .distinct()
  6. .sorted(Comparator.comparing(Trader::getName))
  7. .collect(Collectors.toList());
  8. System.out.println(traders);

4返回所有交易员的名字字符串,并按字母顺序排序:

  1. String traderStr=
  2. transactions.stream()
  3. .map(transaction -> transaction.getTrader().getName())
  4. .distinct()
  5. .sorted()
  6. .reduce("",(n1,n2)->n1+n2);//""表示初值,n1表示上一次的返回结果,n2为这一次的值,n1+n2位这一次返回结果
  7. System.out.println(traderStr);

5有没有交易员是在米兰工作的?

  1. boolean milanBased=
  2. transactions.stream()
  3. .anyMatch(transaction -> transaction.getTrader().getCity().equals("Milan"));//有一个就可以
  4. System.out.println(milanBased);

6打印生活在剑桥的交易员的所有交易额:

  1. transactions.stream().filter(transaction -> "Cambridge".equals(transaction.getTrader().getCity()))
  2. .map(Transaction::getValue)
  3. .forEach(System.out::println);

7所有交易中,最高的交易额是多少?

  1. Optional<Integer> highestValue=
  2. transactions.stream()
  3. .map(Transaction::getValue)//得到交易额
  4. .reduce(Integer::max);//每次保留大的
  5. System.out.println(highestValue.get());

8找到交易额最小的交易:

  1. Optional<Transaction> smallestTransaction=
  2. transactions.stream()
  3. .reduce((t1,t2)->t1.getValue()<t2.getValue()?t1:t2);
  4. System.out.println(smallestTransaction);

发表评论

表情:
评论列表 (有 0 条评论,234人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Streaming API

    Streaming API 概述: Stream是jdk8增加的一个接口,该接口提供了一些对容器数据进行操作的规则,有了这些规则 就可以不通过遍历容器就可以以完成对

    相关 Stream API

    Stream API 首先要理解Stream的概念,说实话这点确实非常的不好理解,尤其是Java IO也有Stream的概念,所以很容易导致混淆.

    相关 Stream API

    以前对集合中元素进行操作的时候需要一个一个遍历的去做,找出符合条件的数据,这样做真的不要太繁琐= =。 sql中却有很强的筛选信息的能力,而且也可以返回你想要的结果。 借鉴