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 }

 

 

 

 

 

---

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