代码之家  ›  专栏  ›  技术社区  ›  Kunal Vohra

列表数据包含其他列表中的所有确切数据

  •  0
  • Kunal Vohra  · 技术社区  · 5 年前

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

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

    查看我的示例数据

    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));
    

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

    0 回复  |  直到 5 年前
        1
  •  0
  •   Hassam Abdelillah    5 年前

    我喜欢用 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));
    

    它运行良好,甚至非开发人员也能在一定程度上读取。