【问题标题】:Java ObservableList filtering with predicate with StringsJava ObservableList 过滤与字符串谓词
【发布时间】:2016-09-12 19:43:20
【问题描述】:

我有一个可观察的列表,我试图用不同的谓词过滤它。

我有嵌套对象进行过滤。

这是第一个pojo

public Class Transaction  {
    private String name; 
    private Account account ; 
    private BigDecimal ammout ; 
}


public class Account{
    private String nameBank;
    private String number;
    private BigDecimal balance;
}

我使用Java 8流API做过滤,它不适用于String,但它非常适合平衡和其他类型。

这是我过滤列表的方法:

public void findByBankName(String bankName) {
ObservableList<Transaction> transactionList = FXCollections
            .observableArrayList();
 return transactionList.stream()
                .filter(t ->
                        t.getAccount().getnameBank().Contains(bankName) )
                .collect(Collectors.toList());

// Instead it work when i do 
// .filter(t ->  t.getAccount().getBalance().doubleValue() > 0 )
}

那么,我的代码有什么问题?

【问题讨论】:

  • a) 您的代码无法编译。 b) 究竟是什么问题?
  • 问题是过滤器不适用于字符串,但当我与数字比较时它可以工作。我已经更新了我的代码
  • “不工作”是什么意思?你的电脑长腿走出门了吗?
  • getnameBank() 返回一个String。在 Java 中,String 没有 Contains 方法。它应该做什么?这只是.contains() 的错字吗?
  • transactionList 在您的示例中为空...因此过滤只会返回一个空列表。

标签: java list filter java-8 java-stream


【解决方案1】:

我认为您只是在此问题中手动键入了代码,这就是出现编译错误的原因。我重构了你的课程(有一些假设)。

帐户类

public class Account{
    private String nameBank;
    private String number;
    private BigDecimal balance;

    public String getNameBank() {
        return nameBank;
    }

    public void setNameBank(String nameBank) {
        this.nameBank = nameBank;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public BigDecimal getBalance() {
        return balance;
    }

    public void setBalance(BigDecimal balance) {
        this.balance = balance;
    }
}

事务类

public class Transaction  {
    private String name;
    private Account account ;
    private BigDecimal ammout ;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    public BigDecimal getAmmout() {
        return ammout;
    }

    public void setAmmout(BigDecimal ammout) {
        this.ammout = ammout;
    }
}

我创建了这个类并命名为 TransactionsManager

public class TransactionsManager {
    private final List<Transaction> transactionsList;

    public TransactionsManager(List<Transaction> transactionsList) {
        this.transactionsList = Collections.unmodifiableList(transactionsList);
    }

    public List<Transaction> findByBankName(String bankName) {
        return transactionsList.stream()
                .filter(t -> t.getAccount().getNameBank().contains(bankName))
                .collect(Collectors.toList());
    }
}

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    相关资源
    最近更新 更多