加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

从Java 8中的方法返回列表?

发布时间:2020-12-15 04:50:05 所属栏目:Java 来源:网络整理
导读:我有以下方法(见下文).代码正在运行,但我得到了很多重复,我应该使用IntStream. 你能指定一下如何更好地优化代码吗?提前致谢. public static ListInteger oddOrEven(ListInteger integers) { long sum = integers.stream().mapToInt(i -i).summaryStatistics
我有以下方法(见下文).代码正在运行,但我得到了很多重复,我应该使用IntStream.

你能指定一下如何更好地优化代码吗?提前致谢.

public static List<Integer> oddOrEven(List<Integer> integers) {
    long sum = integers.stream().mapToInt(i ->i).summaryStatistics().getSum();
    if (sum % 2 == 0) {
        return integers.stream().filter(x -> x % 2==0).distinct().collect(Collectors.toList());
    } else if (sum % 2 != 0) {
        return integers.stream().filter(x -> x % 2 != 0).distinct().collect(Collectors.toList());
    }
    return null;
}

解决方法

看起来你只需要元素的总和来检查它是奇数还是偶数.要知道这一点,就足以检查奇数元素的数量是奇数还是偶数.

您可以将输入拆分为奇数和偶数列表,并根据奇数列表的大小决定返回哪一个:

public static List<Integer> oddOrEven(List<Integer> integers) {
    Map<Boolean,List<Integer>> 
        oddsAndEvens = integers.stream()
                               .collect(Collectors.partitioningBy(i->i%2==0));
    return oddsAndEvens.get(false).size() % 2 == 0 ? // check if there's an even number of odd
                                                     // elements,which means the sum is even
           oddsAndEvens.get(true) : // return the even elements
           oddsAndEvens.get(false); // return the odd elements
}

测试:

System.out.println (oddOrEven(Arrays.asList (1,2,3,4,5)));
System.out.println (oddOrEven(Arrays.asList (1,5,3)));

输出:

[1,5]
[2,4]

编辑:

在我的原始答案中,我错过了distinct()步骤,应该在我们决定是否返回奇数或偶数元素之后执行.我担心这需要添加第二个Stream管道:

public static List<Integer> oddOrEven(List<Integer> integers) {
    Map<Boolean,List<Integer>> 
        oddsAndEvens = integers.stream()
                               .collect(Collectors.partitioningBy(i->i%2==0));
    return oddsAndEvens.get(false).size() % 2 == 0 ?
           oddsAndEvens.get(true).stream().distinct().collect(Collectors.toList()) :
           oddsAndEvens.get(false).stream().distinct().collect(Collectors.toList());
}

或(根据霍尔格的建议):

public static List<Integer> oddOrEven(List<Integer> integers) {
    Map<Boolean,List<Integer>> 
        oddsAndEvens = integers.stream()
                               .collect(Collectors.partitioningBy(i->i%2==0));
    return oddsAndEvens.get(oddsAndEvens.get(false).size() % 2 == 0)
                       .stream()
                       .distinct()
                       .collect(Collectors.toList());
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读