【问题标题】:How to write it using streams? Java 8如何使用流编写它?爪哇 8
【发布时间】:2015-05-25 04:30:11
【问题描述】:

我写了一段代码,想知道如何使用流更优雅地编写它 在这里:

public boolean possibleToAddTask(LocalDate taskDate, final String username) {
        List<Task> userTasklist = find(username).getTaskList();
        for(Task task : userTasklist) {
            if(task.getDate().equals(taskDate)){
                return false;
            }
        }
        return true;
    }

这里 - 从方法返回一些布尔值。如果某个任务中已经存在指定的日期,则返回false,否则返回true(因此返回类型回答了方法名称中提出的问题:))

我尝试在流上使用过滤器,但它只工作了一段时间,然后单元测试给了我一些意想不到的结果,所以我删除了它并把它写成它的上部。现在我想美化它

以前是这样的:

public boolean possibleToAddTask(LocalDate taskDate, final String username) {
        List<Task> userTasklist = find(username).getTaskList();

        try {
            userTasklist.stream().filter(n -> n.getDate().equals(taskDate)).findFirst().get();
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }

提前感谢:)

【问题讨论】:

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


    【解决方案1】:

    方法 findFirst() 返回一个 Optional。所以你可以检查 optional 是否为空。

    return !userTasklist.stream()
    .filter(n -> n.getDate().equals(taskDate))
    .findFirst().isPresent();
    

    或者更简单的方法。

    return !userTasklist.stream().anyMatch(n -> n.getDate().equals(taskDate));
    

    编辑:现在单元测试应该通过了。

    【讨论】:

    • 嗯...也许这更好一点,因为它更接近地模仿了原始逻辑。
    • @lusiak 似乎是完美的解决方案,但是单元测试对于无流解决方案仍然返回 OK,对于流解决方案返回 FAILS
    • 我大概知道为什么了。只需否定返回的流。
    • 是的,我在一分钟前发现了它,不得不考虑一下 :) 它是正确的解决方案,谢谢!还有很多关于流的东西要学习..
    【解决方案2】:

    如何做一些事情,比如将 List 转换为 Set,然后调用 contains():

    return userTasklist.stream().map(Task::getDate).collect(Collectors.toSet()).contains(taskDate);
    

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 2021-01-24
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多