我有一个对象流(列表),并希望从该流创建新对象,以插入到Set中。但是,传入List中的两个或多个对象可能会散列到Set中的同一个Key,在这种情况下,我想将第n个List对象中的String追加到Set中已经存在的对象,而不是创建一个新的对象。
类似这样的东西,但以功能形式:
HashSet<ClassB> mySet = new HashSet<>();
for (ClassA instanceA : classAList) {
if (mySet.contains(ClassB.key(instanceA))) { //static method call to find the key
mySet.get(instanceA).appendFieldA(instanceA.getFieldA());
} else {
mySet.add(new ClassB(instanceA));
}
}
return mySet;
在功能形式中,我想创建如下内容:
List classAList = new ArrayList<>();
classAList.stream()
.map(instanceA -> new ClassB(instanceA))
.collect(Collectors.toSet());
当然,这忽略了hashmap,我不能将多个ClassA实例中的字段合并到同一个ClassB中。我不知道怎么把它放进去。我是否需要忽略map()调用并创建一个自定义收集器来执行此任务?似乎有不止一种方法可以做到这一点,但我是新的流。
您可以将这些条目分组到一个映射中,该映射将散列键映射到元素列表,然后再次调用map将该映射转换为您要查找的集合。大概是这样的:
List classAList = new ArrayList<>();
classAList.stream()
.collect(Collectors.groupingBy(instanceA -> ClassB.key(instanceB)))
.entrySet()
.map(entry -> entry.getValue().stream()
.map(instanceA -> new ClassB(instanceA))
.reduce(null, (a,b) -> a.appendFieldA(b)))
.collect(Collectors.toSet());
很难理解您真正想要的是什么,因为您的html" target="_blank">代码示例根本不起作用。问题是集合
的工作方式与映射
不同,您不能要求它提供包含的等效对象。除此之外,您正在为包含(…)
和获取(…)
调用使用不同的对象。另外,还不清楚ClassB之间的区别。键(instanceA)
和新类B(instanceA)
是。
让我们尝试重新定义它:
假设我们有一个键类型key
和一个方法key。键(instanceA)
定义组候选项。然后我们有一个ClassB
,它是通过newclassb(instanceA)
为一个具有的单个(或主
方法,用于在合并两个组成员时接收另一个ClassA
实例)创建的结果类型。appendFieldA(…)ClassA
实例的值。然后,原始的(前Java
HashMap<Key, ClassB> myMap = new HashMap<>();
for(ClassA instanceA: classAList) {
Key key=Key.key(instanceA);
if(myMap.containsKey(key)) {
myMap.get(key).appendFieldA(instanceA.getFieldA());
} else {
myMap.put(key, new ClassB(instanceA));
}
}
然后,myMap。values()
提供了ClassB
实例的集合。如果必须是集合
,您可以通过
Set<ClassB> result=new HashSet<>(myMap.values());
请注意,当Key
和ClassB
与您的代码中的内容相同时,这也可以起作用,但您可以询问自己,是否确实需要这两者,通过创建的实例。键(instanceA)
和通过新建ClassB(instanceA)
创建的键…
这可以通过Java简化
for(ClassA instanceA: classAList) {
myMap.compute(Key.key(instanceA), (k,b)-> {
if(b==null) b=new ClassB(instanceA);
else b.appendFieldA(instanceA.getFieldA());
return b;
});
}
或者,如果你想让它看起来更时尚:
classAList.forEach(instanceA ->
myMap.compute(Key.key(instanceA), (k,b)-> {
if(b==null) b=new ClassB(instanceA);
else b.appendFieldA(instanceA.getFieldA());
return b;
})
);
对于流解决方案,有一个问题,合并函数将获得相同类型的两个实例,这里是ClassB
,并且不能像上面的compute
解决方案那样通过周围的上下文访问ClassA
实例。对于流解决方案,我们需要ClassB
中的一个方法,它返回第一个ClassA
实例,我们将其传递给它的构造函数,比如getFirstInstanceA()
。然后我们可以使用:
Map<Key, ClassB> myMap = classAList.stream()
.collect(Collectors.toMap(Key::key, ClassB::new, (b1,b2)->{
b1.appendFieldA(b2.getFirstInstanceA().getFieldA());
return b1;
}));
映射器类如下所示:
我有一个POJO旅行者,变量为字符串name,字符串city。我有一个字符串数组,比如 我想要一张地图,上面有名字和城市列表。 我无法给旅行者绘制地图。有没有一种方法可以为旅行者绘制地图,并将其名称作为重点和城市列表。
我创建了一个对象,它映射了数据库中的两个表:字典表和令牌表。表示这两个表之间连接的对象(类)称为DictionaryToken。 下面是课程: 公共类DictionaryToken{private static Logger LOG=Logger.getLogger(DictionaryToken.class); 这是我的问题。除非我添加了一个条件,否则我可以使用带有这个对象的服务执行查询。下面是
我编写了货币转换器程序,从,映射对象并创建选定速率的简单数据集。我的程序运行得很好,直到我停止使用解析和映射对象,并用替换它。它可以很好地读取基础货币和日期,但不能读取<代码>汇率 子对象。为什么? 我的代码:类别: 类: 必须使用映射对象的类: 我试图解析和映射的示例JSON数据 我正在使用这个对象来准备对象,该对象具有一个简单的
问题内容: 我们有一张有很多列的大桌子。移至MySQL Cluster后,由于以下原因无法创建表: 错误1118(42000):行大小太大。不包括BLOB在内的已使用表类型的最大行大小为14000。这包括存储开销,请查阅手册。您必须将某些列更改为TEXT或BLOB 举个例子: 这是用于存储配置参数的表。我在想,我们可以将一些列合并为一个列,并将其存储为JSON对象,然后将其转换为Java对象。 例
流接口中的映射函数定义如下: 函数参数列表与函数接口自己的规范一致 方法是 这意味着它需要一个T,但返回一个R。但我正在运行这个代码 奇怪的是,为什么它能工作,但论点类型似乎不匹配?没有简单的方法来解释它,但我的理解是,一个函数应该接受类型T的输入并返回类型R。当它在流中使用时,它接受类型String的输入并返回类型int(即String.length())。但是小溪。map被键入以返回与流相同的