zoukankan      html  css  js  c++  java
  • 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 }

    ---

  • 相关阅读:
    Java 抽象类 初学者笔记
    JAVA super关键字 初学者笔记
    Java 标准输入流 初学者笔记
    JAVA 将对象引用作为参数修改实例对象参数 初学者笔记
    JAVA 根据类构建数组(用类处理数组信息) 初学者笔记
    JAVA 打印日历 初学者笔记
    Python 测试代码 初学者笔记
    Python 文件&异常 初学者笔记
    Python 类 初学者笔记
    ubuntu网络连接失败
  • 原文地址:https://www.cnblogs.com/tenWood/p/11518381.html
Copyright © 2011-2022 走看看