我们有学生的地图记录Map
Student {
String id;
String grade;
Int age;
}
另外,我们有一个学生ID
的列表(List
虽然其他答案是正确的,但我认为它们并没有更有效,因为它们使用临时内存,或者其共谋不是o(n)
。
另一个答案是这样的:
provided.stream()
.map(id -> new AbstractMap.SimpleEntry<>(id, map.entrySet()
.stream().filter(st -> st.getKey().id == id)
.map(Map.Entry::getValue).findFirst()))
.filter(simpleEntry ->simpleEntry.getValue().isPresent())
.map(entry-> new AbstractMap.SimpleEntry<>(entry.getKey(), entry.getValue().get()))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue))
首先,我要将您的列表
转换为集合
,以避免线性搜索时间:
List<String> ids = ...
Set<String> idsSet = new HashSet<>(ids);
现在,您可以对映射
的条目进行流式处理,过滤出那些在列表
/集合
中具有ID的条目,并将剩余的条目收集到一个输出映射
:
Map<String,StudentRecord> filtered =
input.entrySet()
.stream()
.filter(e -> !idsSet.contains(e.getKey().getId()))
.collect(Collectors.toMap(e -> e.getKey().getId(),Map.Entry::getValue));
您可以对一组条目进行流式处理:
map.entrySet().stream()
.filter(e -> list.contains(e.getKey()))
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
如果还希望将键映射到id
字段,则:
map.entrySet().stream()
.filter(e -> list.contains(e.getKey()))
.collect(toMap(e -> e.getKey().getId(), Map.Entry::getValue));
问题内容: 我已经知道如何用辛苦的方式做到这一点,并使它起作用-遍历条目并“手动”交换。但是我想知道是否可以像许多任务一样以一种更优雅的方式解决这一问题。 我可以假设我的地图是双射的,顺便说一句:) 问题答案: 标准的API / Java运行时不提供双向映射,因此唯一的解决方案是遍历所有条目并手动交换它们。 您可以做的是创建一个包装器类,该包装器类包含两个映射,并且在内部进行双重处理,因此您可以快
我想从复杂映射中读取值,并并行执行一个函数。为此,我使用了Java 8中的ForkJoinPool。 我在这里面临的问题是,对于少数值,函数执行两次。起初我认为,Hashmap不是线程安全的,所以我尝试使用HashTable,但它是相同的。。。
我有一个,我希望在其中返回字符串值的列表,但按int键的升序/降序排序。如果返回的是我也希望排序的迭代项,例如返回或列表,那么这将很容易,但是我想不出一种方法来做到这一点,除了在使用遍历整个映射并插入值以从映射键索引(如下面所示)之后手动创建一个列表,然后在该列表中嵌套另一个以消除任何空值之外。 请告诉我有更好更有效的方法吗?任何帮助都是非常感谢的!
嗨,我正面临着地图序列化的问题,其中关键是一个自定义类。
我正在使用推土机从一个对象映射到另一个对象。我知道Dozer可以做递归映射,但也许我对Dozer施加了太大的压力:p我想从类a映射到类B 当我从A映射到B时,我得到了一个B的实例,但在映射中我得到了一个ObjectA的列表。明确地说,我得到了这个(想象的)对象的一个实例: 如何使推土机正确执行此映射? 注意:ObjectA和ObjectB具有相同的属性(以及int和字符串)。
我有一张地图清单