”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 您需要了解的高级 Java Stream 技巧

您需要了解的高级 Java Stream 技巧

发布于2024-11-18
浏览:479

dvanced Java Stream Tricks You Need to Know

1. 创建映射来缓存实体

在 Map 中缓存实体可以通过减少从数据库或其他数据源重复获取数据的需要来提高性能。使用Java Streams,您可以轻松创建这样的缓存。

示例代码

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class User {
    private int id;
    private String name;

    // Constructors, getters, setters
}

public class EntityCacheExample {
    public static void main(String[] args) {
        List users = List.of(
            new User(1, "Alice"),
            new User(2, "Bob"),
            new User(3, "Charlie")
        );

        Map userCache = users.stream()
            .collect(Collectors.toMap(User::getId, user -> user));

        System.out.println(userCache);
    }
}

在上面的代码中,我们使用Collectors.toMap()将User对象列表转换为Map,其中键是用户的ID,值是User对象本身。这有效地创建了用户实体的缓存。

演示结果

{1=User{id=1, name='Alice'}, 2=User{id=2, name='Bob'}, 3=User{id=3, name='Charlie'}}

2. 创建嵌套映射

当您需要将数据分类为多个级别时,嵌套映射非常有用。例如,您可能希望按部门然后按角色对用户进行分组。

示例代码

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class User {
    private String department;
    private String role;
    private String name;

    // Constructors, getters, setters
}

public class NestedMapExample {
    public static void main(String[] args) {
        List users = List.of(
            new User("HR", "Manager", "Alice"),
            new User("IT", "Developer", "Bob"),
            new User("IT", "Manager", "Charlie")
        );

        Map>> nestedMap = users.stream()
            .collect(Collectors.groupingBy(User::getDepartment,
                Collectors.groupingBy(User::getRole)));

        System.out.println(nestedMap);
    }
}

此代码演示了如何使用Collectors.groupingBy()创建嵌套的Map。外部Map按部门对用户进行分组,而内部Map进一步按角色对用户进行分组。

演示结果

{HR={Manager=[User{name='Alice'}]}, IT={Developer=[User{name='Bob'}], Manager=[User{name='Charlie'}]}}

3. 创建具有两个值的映射

有时,您可能希望在 Map 中存储单个键的多个属性。使用地图
>
可以是一个有效的解决方案。

示例代码

import java.util.List;
import java.util.Map;
import java.util.AbstractMap.SimpleEntry;
import java.util.stream.Collectors;

class User {
    private int id;
    private String name;
    private int age;

    // Constructors, getters, setters
}

public class MapWithTwoValuesExample {
    public static void main(String[] args) {
        List users = List.of(
            new User(1, "Alice", 30),
            new User(2, "Bob", 25),
            new User(3, "Charlie", 35)
        );

        Map> userMap = users.stream()
            .collect(Collectors.toMap(User::getId, user -> 
                new SimpleEntry(user.getName(), user.getAge())));

        System.out.println(userMap);
    }
}

在这里,我们使用 SimpleEntry 创建一个 Map,其中包含与每个用户 ID 相关联的两个值(姓名和年龄)。

演示结果

{1=Alice=30, 2=Bob=25, 3=Charlie=35}

4. 分组依据和映射

分组和映射在一起可以简化复杂的数据转换,例如将对象列表转换为分组的Map,其中每个组包含特定属性。

示例代码

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class User {
    private String department;
    private String name;

    // Constructors, getters, setters
}

public class GroupingByMappingExample {
    public static void main(String[] args) {
        List users = List.of(
            new User("HR", "Alice"),
            new User("IT", "Bob"),
            new User("HR", "Charlie")
        );

        Map> groupedMap = users.stream()
            .collect(Collectors.groupingBy(User::getDepartment,
                Collectors.mapping(User::getName, Collectors.toList())));

        System.out.println(groupedMap);
    }
}

在此示例中,我们按部门对用户进行分组,然后将 User 对象映射到他们的姓名,创建一个 Map,其中每个部门与一个名称列表相关联。

演示结果

{HR=[Alice, Charlie], IT=[Bob]}

5. 分组依据、映射和归约

结合分组、映射和归约,您可以有效地聚合数据,例如对值求和或查找每个组中的最大值。

示例代码

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class Transaction {
    private String type;
    private int amount;

    // Constructors, getters, setters
}

public class GroupingByMappingReducingExample {
    public static void main(String[] args) {
        List transactions = List.of(
            new Transaction("Deposit", 100),
            new Transaction("Deposit", 200),
            new Transaction("Withdrawal", 50),
            new Transaction("Withdrawal", 30)
        );

        Map transactionSums = transactions.stream()
            .collect(Collectors.groupingBy(Transaction::getType,
                Collectors.reducing(0, Transaction::getAmount, Integer::sum)));

        System.out.println(transactionSums);
    }
}

在此代码中,我们按类型对交易进行分组,将它们映射到其金额,然后通过求和来减少金额。结果是一个显示每种交易类型总金额的地图。

演示结果

{Deposit=300, Withdrawal=80}

六、结论

这些高级 Java Stream 技巧可以显着提高您的编码效率和可读性。通过掌握这些技术,您可以轻松处理复杂的数据处理任务。如果您有任何疑问或需要进一步说明,请随时在下面发表评论!

阅读更多帖子:您需要了解的 5 个高级 Java Stream 技巧

版本声明 本文转载于:https://dev.to/anh_trntun_4732cf3d299/5-advanced-java-stream-tricks-you-need-to-know-4i8h?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-18
  • 如何在 PHP 中将数组值重新索引为数字索引?
    如何在 PHP 中将数组值重新索引为数字索引?
    在 PHP 中重新索引数组值考虑以下带有关联键的数组:$array = [ 'id' => 3, 'user_id' => 1, 'clan_id' => 1, // ... 'skill25xp' => 13373505 ];要将键重...
    编程 发布于2024-11-18
  • 如何在 WooCommerce 4+ 中将自定义库存状态添加到 WooCommerce 产品?
    如何在 WooCommerce 4+ 中将自定义库存状态添加到 WooCommerce 产品?
    WooCommerce 4 中 WooCommerce 产品的自定义库存状态 向 WooCommerce 4 中的产品添加自定义库存状态是一个相对简单的过程。但需要修改具体功能,才能保证前后端正确显示状态。添加自定义库存状态添加自定义库存状态,添加将以下代码添加到您的functions.php文件中...
    编程 发布于2024-11-18
  • 如何在 Chrome DevTools 中访问 c​​hrome.storage.sync 数据?
    如何在 Chrome DevTools 中访问 c​​hrome.storage.sync 数据?
    在 Chrome DevTools 中访问 c​​hrome.storage.sync尽管 Chrome DevTools 中提供了本地存储和会话存储检查器,但用户经常遇到 chrome.storage.sync 缺少类似功能的情况。这可以通过替代方法解决。使用扩展程序进行 Chrome 存储检查存...
    编程 发布于2024-11-18
  • Scala Actor 可以替代 Go 的 Goroutine 进行库移植吗?
    Scala Actor 可以替代 Go 的 Goroutine 进行库移植吗?
    协程和 Actor:Go 和 Scala 的比较分析Actor 模型和 Goroutines 之间的相似之处让一些人质疑 Scala 是否可能是一种适合移植利用 Goroutines 的 Go 库的语言。然而,仔细检查就会发现这两个概念之间存在显着差异。协程:通信顺序进程 (CSP) 的基础Go 中...
    编程 发布于2024-11-18
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-11-18
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-18
  • Python 的字符串连接优化适用于大字符串吗?
    Python 的字符串连接优化适用于大字符串吗?
    如何在 Python 中高效地将一个字符串附加到另一个字符串在 Python 中,使用 ' ' 运算符连接字符串是一项常见任务。虽然下面的代码很简单:var1 = "foo" var2 = "bar" var3 = var1 var2它提出...
    编程 发布于2024-11-18
  • 如何使用 PHP 的 `strtotime()` 和替代方案处理 1970 年之前的日期?
    如何使用 PHP 的 `strtotime()` 和替代方案处理 1970 年之前的日期?
    strtotime() 和 1970 年之前的日期由于范围有限,使用 strtotime() 处理 1970 年之前的日期可能会带来挑战。要解决此问题,请检查您的 PHP 版本和平台。如有必要,请考虑升级。或者,为了更灵活地处理更广泛的日期范围,请考虑使用 PHP 的 DateTime 对象。它们允...
    编程 发布于2024-11-18
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于2024-11-18
  • 超越分析器:我们如何实现准确的性能优化?
    超越分析器:我们如何实现准确的性能优化?
    超越分析器:探索替代性能优化技术在他的演讲“性能焦虑”中,Joshua Bloch 强调了分析器的局限性及其潜在的不准确性。然而,这提出了一个问题:我们还有哪些其他选项来优化性能?我们应该回归我们的直觉和猜测吗?Bloch 引用的论文“评估 Java 分析器的准确性”中得出的结论是,分析器可能由于不...
    编程 发布于2024-11-18
  • Pandas 中的 inplace=True 真的值得冒险吗?
    Pandas 中的 inplace=True 真的值得冒险吗?
    在 Pandas 中,Inplace = True 被认为是有害的吗?简介:概念Pandas 中的“就地修改”长期以来一直是争论的话题。在本文中,我们将探讨为什么 inplace = False 是 Pandas 中的默认行为、何时考虑切换到 inplace = True 以及与其使用相关的潜在风险...
    编程 发布于2024-11-18
  • 如何避免 Lambda 函数中的参数修改导致意外结果
    如何避免 Lambda 函数中的参数修改导致意外结果
    Lambda 函数及其参数的范围Lambda 函数是匿名函数,可以捕获其封闭函数的范围。这允许他们从父作用域访问变量和参数。但是,当 lambda 函数使用在封闭函数内修改的参数时,此行为有时会导致意外结果。要说明此问题,请考虑以下代码:def callback(msg): print(ms...
    编程 发布于2024-11-18
  • 如何在 PHP 中从变量实例化类?
    如何在 PHP 中从变量实例化类?
    在 PHP 中从变量实现类实例化在 PHP 中,您可能会遇到需要从变量的值实例化类的场景。让我们用一个例子来说明这一点:$var = 'bar'; $bar = new {$var}Class('var for __construct()'); //$bar = new barClass('var ...
    编程 发布于2024-11-18
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-18

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3