使用方法引用从List中删除元素

时间:2017-07-19 09:53:34

标签: java java-8

我的代码出了什么问题?

我想从List list中删除所有以 A 开头的元素:

public static void main(String[] args) {

    Predicate<String> TTT = "A"::startsWith;
    List<String> list = new ArrayList<>();

    list.add("Magician");
    list.add("Assistant");
    System.out.println(list); // [Magician, Assistant]

    list.removeIf(TTT);
    System.out.println(list); // expected output: [Magician]

}

但是,removeIf不会从列表中删除任何内容。

2 个答案:

答案 0 :(得分:7)

ServletContextListener#contextIntialized是可以分配给"A"::startsWith的方法引用,当针对其他Predicate<String>测试Predicate<String>时,它会检查String { {1}}从其他String开始,而不是相反。

"A"不会删除String中的任何内容,因为“A”既不是以“魔术师”也不是“助理”开头的。

您可以改为使用lambda表达式:

list.removeIf(TTT)

原始list谓词从列表中删除任何内容的唯一方法是列表是否包含Predicate<String> TTT = s -> s.startsWith("A"); "A"::startsWith或空String

答案 1 :(得分:0)

mTrueButton.setEnabled(false);
mFalseButton.setEnabled(false);

checkAnswer(false); //Display the appropriate Toast

new Handler().postDelayed(new Runnable() {
  @Override
  public void run() {
      mTrueButton.setEnabled(true);
      mFalseButton.setEnabled(true);
  }
}, 1500);

方法参考结合了两种技术。 BiPredicate<String, String> b1 = String::startsWith; BiPredicate<String, String> b2 = (string, prefix) -> string.startsWith(prefix); System.out.println(b1.test("chicken", "chick")); System.out.println(b2.test("chicken", "chick")); 是一个实例方法。这意味着使用了lambda中的第一个参数 作为调用方法的实例第二个参数传递给 startsWith()方法本身。这是方法引用如何保存的示例 好好打字。