一、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:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
Trader:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
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 }
---