Java 列表流筛选不正确
我在流媒体时对列表有问题。若我减少流,那个么我会得到正确的结果,但若我过滤流并调用findFirst(),那个么我会得到空的结果。为什么?我做错了什么 索引-包含地图中的数据:Java 列表流筛选不正确,java,collections,java-stream,Java,Collections,Java Stream,我在流媒体时对列表有问题。若我减少流,那个么我会得到正确的结果,但若我过滤流并调用findFirst(),那个么我会得到空的结果。为什么?我做错了什么 索引-包含地图中的数据: public class Index { private final Map<String, String> data = new HashMap<>(); public String getData(String name) { return data
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();
}
}
我解决了这个问题:在一组字符串中有UTF-8bom字符,相同的姓氏在不同的地方。
因此,reduce方法返回流中的第一个对象。Remove
loaded.clear()代码>@ElliottFrisch这没关系。我展示了调试器结果,结果显示列表正确。你的粘贴不正确;例如,调试器中“”的第3行缺少结束参数。如果您解决了这个问题,那么这是一个将两个索引对象转换为布尔值的操作,这将是一个编译错误;您需要向“reduce”传递一个函数,该函数将两个索引对象转换为一个索引对象。这使您的问题无法回答。请显示您的实际代码。然后,您需要创建一个更简单的代码版本,以演示问题。我猜您的实际代码不会硬编码“姓氏”和“史密斯”,所以我会首先检查您在过滤器中使用的字符串是否实际是它们应该是的。我们不能这样做,因为我们不知道您是如何获取或构建这些字符串的。
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;
}
}
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"