【问题标题】:List stream does not filter correct列表流过滤不正确
【发布时间】:2020-08-16 22:15:36
【问题描述】:

我在流式传输时遇到了 List 问题。如果我减少流,那么我会得到正确的结果,但是如果我过滤流并调用 findFirst() 我会得到空结果。为什么?我做错了什么?

索引 - 包含地图中的数据:

public class Index {

    private final Map<String, String> data = new HashMap<>();
    
    public String getData(String name) {
        return data.getOrDefault(name, "");
    }
    
    public Set<String> getDataNames() {
        return data.keySet();
    }
    
    @Override
    public String toString() {
       return data.toString();
    }
}

IndexList - 在列表中包含索引对象,填充是调用 Main 类中的 load() 方法:

public enum IndexList {

    INDICES_0("First list", new LinkedList<>(Arrays.asList("name", "surname", "an")));

    private List<Index> loaded;
    private final String name;
    private final Queue<String> nameQueue;

    IndexList(String name, Queue<String> nameQueue) {
        this.name = name;
        this.nameQueue = nameQueue;
    }

    public Index get(int id) {
        return loaded.get(id-1);
    }

    public List<Index> getLoaded() {
        return loaded;
    }

    public void load() {
        this.loaded = new LinkedList<>();
        
        // ... > loading from xml file

        List<Index> loaded = this.loaded;
        this.loaded = new ArrayList<>(loaded);
        loaded.clear();
    }

    public Queue<String> queueNames() {
        return new LinkedList<>(nameQueue);
    }

    public String getName() {
        return name;
    }
}

我正常运行我看到一些索引对象应该显示在 GUI 中,但它没有。所以我在调试器中运行程序并添加了手表。

在调试器中

IndexList.INDICES_0.loaded.size() = 558
IndexList.INDICES_0.loaded.stream().get(0) = {Index@1700} "{surname=Smith, name=John, an=1/2000}"
IndexList.INDICES_0.loaded.stream().reduce((i0, i1) -> i1.getData("surname").equals("Smith") && i1.getData("name").equals("John")? i1 : i0) = {Optional@1623} "Optional[{surname=Smith, name=John, an=1/2000}]"
IndexList.INDICES_0.loaded.stream().filter(i -> i.getData("surname").equals("Smith") && i.getData("name").equals("John")).findFirst() = {Optional@1640} "Optional.empty"

【问题讨论】:

  • 删除loaded.clear();
  • @ElliottFrisch 没关系。我提供了调试器结果,它显示列表正确。
  • 您的粘贴不正确;例如,'in debugger 的第 3 行缺少一个结束括号。如果你解决了这个问题,这是一个将 2 个索引对象转换为布尔值的操作,这将是一个编译错误;您需要将 2 个 Index 对象转换为一个 Index 对象的函数传入“reduce”。这使您的问题无法回答。
  • 请出示您的实际代码。
  • 然后,您需要创建一个更简单的代码版本,它可以证明问题所在——minimal reproducible example。我猜你的实际代码没有硬编码“姓”和“史密斯”,所以我会首先检查你在过滤器中使用的字符串是否真的是它们应该是的。我们不能这样做,因为我们不知道您是如何获取或构建这些字符串的。

标签: java collections java-stream


【解决方案1】:

我解决了问题:在一组字符串中是 UTF-8 BOM 字符,并且相同的姓氏在不同的地方。 所以,reduce 方法返回了流中的第一个对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多