【问题标题】:List Data ContainsAll Exactly Data In Other List [duplicate]列表数据包含其他列表中的所有确切数据[重复]
【发布时间】:2020-07-29 10:31:32
【问题描述】:

在我的业务案例中,我需要选择已为第三方经销商分配代码的可乐品牌的代码

我需要交叉检查当前合同中的所有经销商代码是否正确,并且没有输入外部代码。为此,我有代码的主列表。

查看我拥有的示例数据

List<String> mixedOfLAndPCodes = ["L123", "P123", "P234", "", "P2345", ""];
List<String> masterPCodes = ["P123", "P234", "P2345", "P111", "P23456"];
String masterLCode = "L123";

我如何确定所有mixedOfLAndPCodes 都在java stream 的主代码列表中可用?

我写的代码是这样的

boolean a = mixedOfLAndPCodes.stream().allMatch(it -> masterLCode.equals(it) || masterPCodes.contains(it));

无法确定这是否足以测试我的案例或需要一些改进。

【问题讨论】:

  • 你想如何处理空字符串?由于mixedOfLAndPCodes 列表中存在2 个空字符串,您当前的代码将返回false。这是期望的结果吗?
  • 有空字符串是可以的。这意味着没有分配可乐。
  • 在这种情况下,您可能希望从 Stream 中过滤掉空字符串。否则 allMatch 将返回 false。
  • 您没有发现代码有任何问题吗?
  • List 实例化存在问题,它将无法工作。你应该使用类似List.of("L123", "P123", "P234", "", "P2345", "")的东西。除此之外,已经提到的空字符串处理应该可以工作。

标签: java java-8 java-stream predicate


【解决方案1】:

我喜欢使用Predicate 来说明我为什么要编写某个代码。

我们可以根据您的情况,为您需要的每个人创建一个谓词,然后将它们结合起来给出一个概述。这是一个例子:

   public static Predicate<String> isExistingPMaster(List<String> pCodes) {
        return pCodes::contains;
   }

    public static Predicate<String> isExistingLMaster(List<String> lCodes) {
        return lCodes::contains; 
     /*
      * here we manage a list of lCodes but it also could be 
      * a single string with an equals() as in your question.
      *
      */
    }

    public static Predicate<String> isExistingInMaster(List<String> pCodes, List<String> lCodes) {
        return isExistingPMaster(pCodes).or(isExistingLMaster(lCodes));
    }

创建谓词后,我们可以直接在流中使用它们:

List<String> mixedOfLAndPCodes = Arrays.asList("L123", "P123", "P234", "", "P2345", "");
List<String> masterPCodes = Arrays.asList("P123", "P234", "P2345", "P111", "P23456");
List<String> masterLCode = Arrays.asList("L123", "L125");

mixedOfLAndPCodes.stream().filter(isExistingInMaster(masterPCodes, masterLCode));

流畅性好,甚至非开发者阅读也达到一定水平。

【讨论】:

  • masterCode 是单个字符串 :)
  • 是的,我注意到了。但我的提议是故意的。无论是字符串还是其他字符串,将事物分开通常是一件好事
猜你喜欢
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2020-09-22
  • 2019-07-03
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 2015-12-29
相关资源
最近更新 更多