【问题标题】:Java - not anonymous Comparator analogue to select elements from collectionJava - 不是匿名比较器模拟从集合中选择元素
【发布时间】:2015-04-01 07:24:23
【问题描述】:

我有兴趣问题。有一个抽象类,它将被子类扩展。 在抽象类中有如下方法:

public abstract class MyAbstractClass {
    protected List<MyObject> findSpecificObjects(List<MyObject> objectsToSelectFrom, List<MyObject> objectsToCompare) {
        List<MyObject> selected = new ArrayList<MyObject>();
        //there I need to select elements from objectsToSelectFrom
        //using MyComparatorAnalogue with objectsToCompare
        return selected;
    }

    protected class MyComparatorAnalogue implements ??? {
        /*this comparator analogue should have an access to objectsToCompare
        it must select elements from objectsToSelectFrom with property myProperty=someValue, where someValue - value that no one element from objectsToCompare have in the same property myProperty
        */
    }
}

我为什么要这样做,因为我需要能够在子类中覆盖 MyComparator。有什么办法可以做我想做的事吗?我查看了 Apache Commons Collections,但在这种情况下没有找到任何可以帮助我的东西。

例如:

objectsToSelectFrom = {[key=Michael,value=23],[key=Luis,value=44],[key=Andrew,value=26]}
objectsToCompare = {[key=John,value=23],[key=Luis,value=44]}

假设myPropertyvalue 属性MyComparatorAnalogue 应该选择[key=Andrew,value=26] 元素。

希望我描述得通俗易懂。谢谢。

【问题讨论】:

  • 您要根据 while 列表过滤 List&lt;MyObject&gt; 吗?
  • 是的,类似的。但是 objectsToSelectFrom 和 objectToCompare 中的对象并不相同,它们只是具有(或不具有)相同的 myProperty 值。

标签: java collections apache-commons comparator java-6


【解决方案1】:

使用 Java 8 和流,你可以做这样的事情。

    List<MyObject> l = new ArrayList<>();
    l.add(new MyObject("foo", "FOO"));
    l.add(new MyObject("bar", "BAR"));
    l.add(new MyObject("baz", "BAZ"));

    List<MyObject> whitelist = new ArrayList<>();
    whitelist.add(new MyObject("other bar", "BAR"));

    Predicate<? super MyObject> inWhitelist = (MyObject o) -> {
        return whitelist.stream().anyMatch((p) ->
          o.getValue().equals(p.getValue()));
    };

    List<MyObject> filtered =
      l.stream().filter(inWhitelist).collect(Collectors.toList());

现在filtered 包含MyObject("bar", "BAR"),它与MyObject("other bar", "BAR") 具有相同的value

【讨论】:

  • 我必须使用 Java 6 :(
  • Java 6 已弃用。
  • 是的,但是我正在处理的项目的某些部分在 Java 7+ 上运行时会中断。不要问如何以及为什么 - 我不知道 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多