Java8中常用的一些流计算方法

目录

1. 过滤 (Filter)

2. 映射 (Map)

3. 排序 (Sorted)

4. 归约 (Reduce)

5. 收集 (Collect)

6. 匹配 (Match)

7. 查找 (Find)

8. 统计 (Count)

9. 并行流 (Parallel Streams)

应用

List转Map

1v1-list转map:

1vN-list转map:

Set转Map

1vN-set转map:

1v1-set转map:

Set与List互相转化

字符串转化成List

List/Set中某一列求和

根据条件过滤转化

List/Set对象的某一属性组成新的list/set


        Java 8 引入了 Stream API,这是一个新的抽象层,旨在提高对集合的操作和处理的效率和简便性。Stream API 强调的是一种功能性的近似,通过利用更高级的迭代操作,可以实现更简洁和更易于理解的代码。

1. 过滤 (Filter)

使用 .filter() 方法可以从流中排除某些元素。该方法接受一个 Predicate 函数式接口作为参数(一个返回布尔值的函数)。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
    .filter(name -> name.startsWith("A"))
    .collect(Collectors.toList());
2. 映射 (Map)

.map() 方法用于将流中的每个元素映射到另一个元素。它接受一个 Function 接口。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<Integer> nameLengths = names.stream()
    .map(String::length)
    .collect(Collectors.toList());
3. 排序 (Sorted)

.sorted() 方法用于对流中的元素进行排序。它可以采用自然排序或者接受一个自定义的 Comparator。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> sortedNames = names.stream()
    .sorted()
    .collect(Collectors.toList());
4. 归约 (Reduce)

.reduce() 方法用于通过某个操作合并流中的所有元素。它是一个终端操作,返回一个 Optional 类型的结果。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
    .reduce(0, (a, b) -> a + b);
5. 收集 (Collect)

.collect() 方法是一个终端操作,它接受一个 Collector 实例并将流元素转换成不同类型的结果,如列表、集合或者其他数据结构。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> listNames = names.stream()
    .collect(Collectors.toList());
6. 匹配 (Match)

流 API 提供了三种匹配操作:anyMatch(), allMatch(), 和 noneMatch(),它们都接受一个 Predicate 并返回一个 boolean 值。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean allEven = numbers.stream()
    .allMatch(n -> n % 2 == 0); // false
boolean anyEven = numbers.stream()
    .anyMatch(n -> n % 2 == 0); // true
boolean noneMatch = numbers.stream()
    .noneMatch(n -> n > 10); // true
7. 查找 (Find)

.findFirst() 和 .findAny() 方法提供了一种方法来检索流中的元素。这些方法返回 Optional 类型的对象。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
Optional<String> first = names.stream()
    .findFirst();
8. 统计 (Count)

.count() 方法返回流中元素的数量。

long count = names.stream().count();
9. 并行流 (Parallel Streams)

.parallelStream() 方法可以并行处理元素,利用多核处理器的优势来加速处理过程。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sumParallel = numbers.parallelStream()
    .reduce(0, Integer::sum);

应用

List转Map

1v1-list转map:
    public static void main(String[] args) {
        List<UserVO> list = new ArrayList<>();
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            list.add(userVO);
        }
        //以整个对象为value
        Map<Integer,UserVO> map = list.stream().collect(Collectors.toMap(UserVO::getUserId,u->u));
        //以对象某个属性为value
        Map<Integer,String> nameMap = list.stream().collect(Collectors.toMap(UserVO::getUserId,UserVO::getFullName));
    }
1vN-list转map:
    public static void main(String[] args) {
        List<UserVO> list = new ArrayList<>();
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            list.add(userVO);
        }
        //以整个对象为value
        Map<Integer,List<UserVO>> map = list.stream().collect(Collectors.groupingBy(UserVO::getOrgId,Collectors.toList()));
    }

Set转Map

1vN-set转map:
    public static void main(String[] args) {
        Set<UserVO> set = new HashSet<>();
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            set.add(userVO);
        }
        //以整个对象为value
        Map<Integer,List<UserVO>> map = set.stream().collect(Collectors.groupingBy(UserVO::getOrgId,Collectors.toList()));
    }
1v1-set转map:
    public static void main(String[] args) {
        Set<UserVO> set = new HashSet<>();
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            set.add(userVO);
        }
        //以整个对象为value
        Map<Integer,UserVO> entityMap = set.stream().collect(Collectors.toMap(UserVO::getUserId,u->u));
        //以某一属性为value
        Map<Integer,String> map = set.stream().collect(Collectors.toMap(UserVO::getUserId,UserVO::getFullName));
    }

Set与List互相转化

    public static void main(String[] args) {
        Set<UserVO> set = new HashSet<>();
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            set.add(userVO);
        }
        List<UserVO> list = set.stream().collect(Collectors.toList());
        Set<UserVO> setNew = list.stream().collect(Collectors.toSet());
    }

字符串转化成List

    public static void main(String[] args) {
        String str = "2312,1,524,67,23,58,32";
        ArrayList<Integer> list = Arrays.stream(str.split(","))
            .map(String::trim).map(Integer::valueOf)
            .collect(Collectors.toCollection(ArrayList::new));
        System.out.println(list);
    }

List/Set中某一列求和

    public static void main(String[] args) {
        Set<UserVO> set = new HashSet<>();
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            set.add(userVO);
        }
        Integer sum = set.stream().mapToInt(UserVO::getOrgId).sum();
        List<UserVO> list = set.stream().collect(Collectors.toList());
        Integer sum1 = list.stream().mapToInt(UserVO::getOrgId).sum();
    }

根据条件过滤转化

    public static void main(String[] args) {
        Set<UserVO> set = new HashSet<>();
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            set.add(userVO);
        }
        List<UserVO> list = set.stream().filter(u->u.getUserId()<10).collect(Collectors.toList());
        System.out.println(list.size());
    }

List/Set对象的某一属性组成新的list/set

    public static void main(String[] args) {
        Set<UserVO> set = new HashSet<>();
        for(int i = 0;i<100;i++){
            UserVO userVO = new UserVO();
            userVO.setUserId(i+1);
            userVO.setOrgId(i%3);
            userVO.setFullName("li"+i);
            set.add(userVO);
        }
        List<String> list = set.stream().map(UserVO::getFullName).collect(Collectors.toList());
    }

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值