java-根据用户选择/输入从集合中过滤对象

控制台应用的高级过滤
本文探讨了在控制台应用程序中实现复杂过滤功能的方法,利用Java的BiPredicate和Stream API来根据用户输入的多种标准过滤消息集合,展示了如何通过组合谓词实现自定义过滤选项。

我的练习很简单,但是受我的知识和使用设计模式(单元测试)的要求的限制.项目的目标是创建一个控制台应用程序,该应用程序将允许您从集合中保存(添加),打印(显示所有),删除(按标准删除)和过滤(按标准显示)消息.

 

 

private String title;
private String author;
private String content;
private String creationDate;

我能够创建“添加”功能和“全部显示”.我的问题是过滤.我必须创建一个选项,以根据用户给出的条件来过滤保存的对象(所有可能的组合,例如:按标题过滤和creationDate,按标题过滤等).我考虑过通过使用以下开关和方法为用户提供从菜单中选择选项的选项:

 

private final List<Message> storage = new ArrayList<Message>();

public List<Message> getAll() {
    final ArrayList<Message> messages = new ArrayList<>();
    messages.addAll(storage);
    return messages;
}
List<Message> find(String author) {
    return simpleStorage.getAll().stream()
        .filter(item -> item.getAuthor() == author)
        .collect(toList());
}

但是我认为复制很多类似的代码不是一个好习惯.另外,我将来可能会发现自己的解决方案将很累,甚至是不可能的(每个新参数都会添加新组合).有更好的方法吗?就像选择“一个一个”的标准,以便用户可以自己创建一个组合?我有一个提示,谓词可以帮助我解决这个问题,但是我不知道该怎么做.

最佳答案

对于每个标准,您可以具有BiPredicate< String,Message> 1,该BiPredicate< String,Message> 1接收来自用户的原始输入和一条消息,并判断该消息是否与过滤选项2相匹配.

 

 

Map<String, BiPredicate<String, Message>> criteria = Map.of(
        "title", (userTitle, message) -> input.equals(message.getTitle())
        ...
);

我将为您提供一个简化示例,说明如何使用该地图:

 

Scanner scanner = new Scanner(System.in);

String filteringOption = scanner.nextLine();
String userInput = scanner.nextLine();

BiPredicate<String, Message> predicate = criteria.get(filteringOption);

// get all messages from the storage
getAll()  
        // make a stream out of them
        .stream()
        // apply the filtering rule from the map
        .filter(m -> predicate.test(userInput, m))  
         // collect them into a list to display
        .collect(Collectors.toList());

以后,可以通过诸如or()和and()之类的逻辑运算来组合这些谓词,以形成自定义过滤器选项.可以将用户的选项添加到地图中以进行后续呼叫,或者可以在用户每次请求时即时进行计算,例如

 

BiPredicate<String, Message> titleAndDateFilter = 
    criteria.get("title").and(criteria.get("date"));

1您可以使用Predicate< Message&gt ;,但是由于您需要将消息的上下文与给定的输入进行比较,这会使这些功能的隔离度降低.
2我使用了Java 9的Map.of.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值