NumericStream && Stream综合练习

一、NumericStream    

我们可以将一个Stream转化为对应的数字Stream,如mapToInt、mapToLong转化为IntStream、LongStream等(NumericStream又可以通过boxed、mapToObj方法转化回去),这样做的好处是可以节省比较多的内存开销,数据量大的话是比较明显的,因为int 4个字节的数字比Integer类型的小很多。所以能用NumericStream类型的就用。

 1 package com.cy.java8;
 2 
 3 import java.util.Arrays;
 4 import java.util.stream.IntStream;
 5 import java.util.stream.Stream;
 6 
 7 public class NumericStream {
 8 
 9     public static void main(String[] args) {
10         Stream<Integer> stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5});
11 
12         //把大于3的和打印出来
13         Integer result = stream.filter(i -> i.intValue() > 3).reduce(0, Integer::sum);
14         System.out.println(result);
15 
16         //可以将Stream<Integer>转化为IntStream,再求和
17         stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5});
18         int result2 = stream.mapToInt(Integer::intValue).filter(i -> i > 3).sum();
19         System.out.println(result2);
20 
21         //将IntStream转化为Stream<Integer>
22         stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5});
23         IntStream intStream = stream.mapToInt(Integer::intValue);
24         Stream<Integer> boxed = intStream.boxed();
25 
26         //计算1..100数里面,有哪些数能和9,满足勾股定理,然后将这些数以[a, b, c]的形式打印出来
27         int a = 9;
28         IntStream.rangeClosed(1, 100).filter(b -> Math.sqrt(b * b + a * a) % 1 == 0)
29                 .boxed()
30                 .map(b -> new int[]{a, b, (int) Math.sqrt(a * a + b * b)})
31                 .forEach(r -> System.out.println("a=" + r[0] + ", b=" + r[1] + ", c=" + r[2]));
32 
33         //或者这么写
34         IntStream.rangeClosed(1, 100).filter(b -> Math.sqrt(b * b + a * a) % 1 == 0)
35                 .mapToObj(b -> new int[]{a, b, (int) Math.sqrt(a * a + b * b)})
36                 .forEach(r -> System.out.println("a=" + r[0] + ", b=" + r[1] + ", c=" + r[2]));
37     }
38 
39 }

打印结果:

9
9
a=9, b=12, c=15
a=9, b=40, c=41
a=9, b=12, c=15
a=9, b=40, c=41

 

二、Stream综合练习        

需求:
1.获取2011年所有的交易,根据value排序。
2.哪个是交易员工作的唯一城市?
3.找到所有来自剑桥的交易员,根据名字排序
4.返回一个根据ASCII排序的所有交易员的名字的string
5.有来自米兰的交易员吗?
...

代码:

Transaction:

 1 package com.cy.java8;
 2 
 3 import lombok.AllArgsConstructor;
 4 import lombok.Data;
 5 
 6 /**
 7  * 交易数据
 8  */
 9 @AllArgsConstructor
10 @Data
11 public class Transaction {
12     private final Trader trader;
13     private final int year;
14     private final int value;
15 }
View Code

Trader:

 1 package com.cy.java8;
 2 
 3 import lombok.AllArgsConstructor;
 4 import lombok.Data;
 5 
 6 /**
 7  * 交易员
 8  */
 9 @AllArgsConstructor
10 @Data
11 public class Trader {
12     private final String name;
13     private final String city;
14 }
View Code
 1 package com.cy.java8;
 2 
 3 import java.util.Arrays;
 4 import java.util.Comparator;
 5 import java.util.List;
 6 import java.util.Optional;
 7 import java.util.stream.Collectors;
 8 
 9 public class StreamInAction {
10 
11     public static void main(String[] args) {
12         Trader raoul = new Trader("Raoul", "Cambridge");
13         Trader mario = new Trader("Mario", "Milan");
14         Trader alan = new Trader("Alan", "Cambridge");
15         Trader brian = new Trader("Brian", "Cambridge");
16 
17         List<Transaction> transactions = Arrays.asList(
18                 new Transaction(brian, 2011, 300),
19                 new Transaction(raoul, 2012, 1000),
20                 new Transaction(raoul, 2011, 400),
21                 new Transaction(mario, 2012, 710),
22                 new Transaction(mario, 2012, 700),
23                 new Transaction(alan, 2012, 950)
24         );
25 
26         //获取2011年的所有交易,并且按value排序
27         List<Transaction> result = transactions.stream().
28                 filter(t -> t.getYear() == 2011)
29                 .sorted(Comparator.comparingInt(Transaction::getValue))
30                 .collect(Collectors.toList());
31         System.out.println(result);     //[Transaction(trader=Trader(name=Brian, city=Cambridge), year=2011, value=300), Transaction(trader=Trader(name=Raoul, city=Cambridge), year=2011, value=400)]
32 
33 
34         //交易员工作的城市有哪些
35         List<String> result1 = transactions.stream().map(t -> t.getTrader().getCity()).distinct().collect(Collectors.toList());
36         System.out.println(result1);    //[Cambridge, Milan]
37 
38         //找到所有来自剑桥的交易员,按名字排序
39         List<Trader> result2 = transactions.stream().map(Transaction::getTrader)
40                                             .filter(t -> t.getCity().equals("Cambridge"))
41                                             .distinct()
42                                             .sorted(Comparator.comparing(Trader::getName))
43                                             .collect(Collectors.toList());
44         System.out.println(result2);    //[Trader(name=Alan, city=Cambridge), Trader(name=Brian, city=Cambridge), Trader(name=Raoul, city=Cambridge)]
45 
46         //返回一个字符串,包括所有交易员的名字,按ascii排序
47         String result3 = transactions.stream().map(t -> t.getTrader().getName())
48                                             .distinct()
49                                             .sorted()
50                                             .reduce("", (name1, name2) -> name1 + name2);
51         System.out.println(result3);    //AlanBrianMarioRaoul
52 
53         //有来自米兰的交易员吗
54         boolean result4 = transactions.stream().anyMatch(t -> t.getTrader().getCity().equals("Milan"));
55         System.out.println(result4);    //true
56 
57         //打印所有的交易value总和来自于来自于生活在剑桥的交易员
58         Integer result5 = transactions.stream().filter(t -> t.getTrader().getCity().equals("Cambridge"))
59                                             .map(Transaction::getValue)
60                                             .reduce(0, (t1, t2) -> t1 + t2);
61         System.out.println(result5);    //2650
62 
63         //最高的交易的value
64         Optional<Transaction> optional = transactions.stream().max(Comparator.comparingInt(Transaction::getValue));
65         System.out.println(optional.get().getValue());      //1000
66         System.out.println(transactions.stream().map(Transaction::getValue).reduce((i,j) -> i>j?i:j).get());    //1000
67 
68         //最小的交易的value
69         System.out.println(transactions.stream().map(Transaction::getValue).reduce(Integer::min).get());    //300
70     }
71 }

 

 

 

 

 

---

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章