【问题标题】:use of removeif for filtering list containing objects使用 removeif 过滤包含对象的列表
【发布时间】:2018-05-15 18:55:05
【问题描述】:

我坚持使用 removeif java 8 并寻求帮助

List<ACHTransaction> transactions = transactionDao.retrieveTransactions(getJobParameters();

我想根据检查对象的属性从交易中删除这些交易

如果 transaction.getFileHash 不为空,那么我想删除该事务。如果 transaction.getFileHash 为 null 我想保留它。

所以我正在尝试 removeif

List<ACHTransaction> transactions = transactionDao.retrieveTransactions(getJobParameters().removeIf(t -> (Optional.ofNullable(t.getFileHash()).orElse(0).intValue() != 0));

但我遇到了错误。有人可以解释 removeif 如何处理对象属性吗?

【问题讨论】:

  • 你遇到了什么错误?
  • 不兼容的类型 必需的 ACHTransaction 找到 boolean
  • removeIf 修改你调用它的集合并返回一个boolean 告诉你它是否修改了集合,即是否有任何匹配的元素。您不能将 boolean 分配给 List

标签: java spring-boot java-8 spring-data spring-data-jpa


【解决方案1】:

目前我已经解决了

List<ACHTransaction> transactions =
        achManagementDao
            .retrieveTransactions(getJobParameters())
            .stream()
            .filter(t -> !(Optional.ofNullable(t.getFileHash()).orElse(0).intValue() == 0))
            .collect(Collectors.toList());

如果有更好的方法请告诉我

【讨论】:

  • filter 操作中使用Optional 没有任何意义。它远不是可读的代码,必须维护它的可怜的灵魂将很难弄清楚你的意图。最好只使用filter(t -&gt; t.getFileHash() == null)
【解决方案2】:

您可以检索列表,然后使用removeIf 删除元素:

List<ACHTransaction> transactions =
    transactionDao.retrieveTransactions(getJobParameters());

transactions.removeIf(t -> t.getFileHash() != null);

或者您可以按照自己的答案进行操作并使用流:

List<ACHTransaction> transactions =
    transactionDao.retrieveTransactions(getJobParameters()).stream()
        .filter(t -> t.getFileHash() == null)
        .collect(Collectors.toList());

【讨论】:

  • t 可以为空,这是我使用 optional 的原因
  • @Satya 是的,t 可以为空,但这并不意味着您必须在看到null 值时使用Optional。您应该始终尝试编写易于阅读和理解的代码。 Optional 旨在用作方法中的返回类型。
  • 是的,你是对的。就我而言,我不拥有其他代码来纠正设计问题。感谢 cmets。
【解决方案3】:

我测试了下面的一段代码,它按要求工作。我希望这就是你要找的。​​p>

import java.util.ArrayList;
import java.util.List;

public class TestRemoveIf {



public static void main(String[] args) {

    Transaction myTrans1 = new Transaction("myTrans1");
    Transaction myTrans2 = new Transaction("myTrans2");
    Transaction myTrans3 = new Transaction("myTrans3");
    Transaction myTrans4 = new Transaction("myTrans4");

    myTrans1.setFileHash("not Null");
    myTrans3.setFileHash("not null");

    List<Transaction> trList = new ArrayList();
    trList.add(myTrans1);
    trList.add(myTrans2);
    trList.add(myTrans3);
    trList.add(myTrans4);

    trList.removeIf(t -> t.getFileHash()!=null);

    System.out.println(trList);


}


}


public class Transaction {

String fileHash;
String name;

public String getFileHash() {
    return fileHash;
}

public void setFileHash(String fileHash) {
    this.fileHash = fileHash;
}

public Transaction(String name) {
    super();
    this.name = name;
}

@Override
public String toString() {
    return "Transaction [fileHash=" + fileHash + ", name=" + name + "]";
}



}

【讨论】:

    猜你喜欢
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多