」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 您需要了解的高階 Java Stream 技巧

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

發佈於2024-11-18
瀏覽:261

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]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3