Java 8 - Stream实战

简介: Java 8 - Stream实战

20200510181139786.png



Pre

Java 8 - Stream流骚操作解读

Java 8 - Stream流骚操作解读2_归约操作

都学了这俩,是不是该出来练一练了?


练习

基础数据

  Trader raoul = new  Trader("Raoul", "Cambridge");
        Trader mario = new Trader("Mario", "Milan");
        Trader alan = new Trader("Alan", "Cambridge");
        Trader brian = new Trader("Brian", "Cambridge");
        List<Transaction> transactions = Arrays.asList(
                new Transaction(brian, 2011, 300),
                new Transaction(raoul, 2012, 1000),
                new Transaction(raoul, 2011, 400),
                new Transaction(mario, 2012, 710),
                new Transaction(mario, 2012, 700),
                new Transaction(alan, 2012, 950)
        );


(1) 找出2011年发生的所有交易,并按交易额排序(从低到高)

 List<Transaction> collect = transactions.stream()
                .filter(t -> t.getYear() == 2011)
                .sorted(Comparator.comparing(Transaction::getValue))
                .collect(toList());


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


        List<String> collect1 = transactions.stream()
                .map(t->t.getTrader().getCity())
                .distinct()
                .collect(toList());

(3) 查找所有来自于剑桥的交易员,并按姓名排序。

 transactions.stream().map(t->t.getTrader())
                .filter(x -> x.getCity().equals("Cambridge"))
                .distinct()
                .sorted(Comparator.comparing(Trader::getName))
                .forEach(System.out::println);


20210310231529683.png


(4) 返回所有交易员的姓名字符串,按字母顺序排序。

   String value = transactions.stream().map(t -> t.getTrader().getName())
                .distinct()
                .sorted()
                .reduce("", (name1, name2) -> name1 + name2);
        System.out.println(value);


20210310231600442.png



请注意,此解决方案效率不高(所有字符串都被反复连接,每次迭代的时候都要建立一个新的 String 对象)。

更为高效的解决方案,它像下面这样使用 joining

String traderStr =
  transactions.stream()
    .map(transaction -> transaction.getTrader().getName())
    .distinct()
    .sorted()
    .collect(joining());


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

    boolean liveInMilan1 = transactions.stream().anyMatch(t -> t.getTrader().getCity().equals("Milan"));
        boolean liveInMilan2 = transactions.stream().map(Transaction::getTrader).anyMatch(t -> t.getCity().equals("Milan"));
        System.out.println(liveInMilan1);
        System.out.println(liveInMilan2);



20210310231722259.png


(6) 打印生活在剑桥的交易员的所有交易额。

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


20210310231747888.png



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

    Optional<Integer> maxValue = transactions.stream().map(Transaction::getValue).reduce((i, j) -> i > j ? i : j);
        System.out.println(maxValue.get());



20210310231811577.png

(8) 找到交易额最小的交易

        Optional<Integer> minValue = transactions.stream().map(Transaction::getValue).reduce(Integer::min);
        System.out.println(minValue.get());


20210310231827485.png


还可以做得更好。流支持 min 和 max 方法,它们可以接受一个 Comparator 作为参数,指定计算最小或最大值时要比较哪个键值:

Optional<Transaction> smallestTransaction =
  transactions.stream()
        .min(comparing(Transaction::getValue));


附 Trader & Transaction

package com.artisan.java8.stream.excise;
public class Trader{
    private final String name;
    private final String city;
    public Trader(String n, String c){
        this.name = n;
        this.city = c;
    }
    public String getName(){
        return this.name;
    }
    public String getCity(){
        return this.city;
    }
    public String toString(){
        return "Trader:"+this.name + " in " + this.city;
    }
}


package com.artisan.java8.stream.excise;
public class Transaction {
    private final Trader trader;
    private final int year;
    private final int value;
    public Transaction(Trader trader, int year, int value) {
        this.trader = trader;
        this.year = year;
        this.value = value;
    }
    public Trader getTrader() {
        return this.trader;
    }
    public int getYear() {
        return this.year;
    }
    public int getValue() {
        return this.value;
    }
    public String toString() {
        return "{" + this.trader + ", " +
                "year: " + this.year + ", " +
                "value:" + this.value + "}";
    }
}


相关文章
|
4天前
|
Java 应用服务中间件 开发者
【实战指南】Java Socket编程:构建高效的客户端-服务器通信
【6月更文挑战第21天】Java Socket编程用于构建客户端-服务器通信。`Socket`和`ServerSocket`类分别处理两端的连接。实战案例展示了一个简单的聊天应用,服务器监听端口,接收客户端连接,并使用多线程处理每个客户端消息。客户端连接服务器,发送并接收消息。了解这些基础,加上错误处理和优化,能帮你开始构建高效网络应用。
|
3天前
|
Java
【实战演练】JAVA网络编程高手养成记:URL与URLConnection的实战技巧,一学就会!
【6月更文挑战第22天】在Java网络编程中,理解和运用URL与URLConnection是关键。URL代表统一资源定位符,用于标识网络资源;URLConnection则用于建立与URL指定资源的连接。通过构造URL对象并调用openConnection()可创建URLConnection。示例展示了如何发送GET请求读取响应,以及如何设置POST请求以发送数据。GET将参数置于URL,POST将参数置于请求体。练习这些基本操作有助于提升网络编程技能。
|
4天前
|
IDE Java 开发工具
从零开始学Java Socket编程:客户端与服务器通信实战
【6月更文挑战第21天】Java Socket编程教程带你从零开始构建简单的客户端-服务器通信。安装JDK后,在命令行分别运行`SimpleServer`和`SimpleClient`。服务器监听端口,接收并回显客户端消息;客户端连接服务器,发送“Hello, Server!”并显示服务器响应。这是网络通信基础,为更复杂的网络应用打下基础。开始你的Socket编程之旅吧!
|
2天前
|
前端开发 安全 Java
Java服务器端开发实战:利用Servlet和JSP构建动态网站
【6月更文挑战第23天】**Servlet和JSP在Java Web开发中扮演关键角色。Servlet处理业务逻辑,管理会话,JSP则结合HTML生成动态页面。两者协同工作,形成动态网站的核心。通过Servlet的doGet()方法响应请求,JSP利用嵌入式Java代码创建动态内容。实战中,Servlet处理数据后转发给JSP展示,共同构建高效、稳定的网站。虽然新技术涌现,Servlet与JSP仍为Java Web开发的基石,提供灵活且成熟的解决方案。**
|
1天前
|
Java
java同一个任务使用for循环与Stream比较
java同一个任务使用for循环与Stream比较
7 1
|
1天前
|
Java
java中Stream流中的forEach、filter、map、count、limit、skip、concat
java中Stream流中的forEach、filter、map、count、limit、skip、concat
7 0
|
1天前
|
Java
java中将集合数组转换为Stream流
java中将集合数组转换为Stream流
6 0
|
1天前
|
Java
java操作list使用Stream
java操作list使用Stream
3 0
|
1天前
|
存储 SQL Java
Java Stream
Java Stream
3 0
|
1天前
|
SQL 监控 Java
技术实战:Java数据库连接池优化策略解析
【6月更文挑战第24天】Java应用的数据库连接池优化关键在于参数调整、预编译SQL和监控。案例中,高并发购物系统初期使用C3P0,因参数不合理导致性能瓶颈。调整如设置`MinPoolSize`为10,`MaxPoolSize`为50,和`CheckoutTimeout`为3000ms,配合预编译SQL提升执行效率。通过JMX监控连接池状态,动态调优,确保系统响应速度和资源利用。