我对该Function.identity()方法的用法有疑问.
想象一下以下代码:
Arrays.asList("a", "b", "c")
.stream()
.map(Function.identity()) // <- This,
.map(str -> str) // <- is the same as this.
.collect(Collectors.toMap(
Function.identity(), // <-- And this,
str -> str)); // <-- is the same as this.
Run Code Online (Sandbox Code Playgroud)
是否有任何理由你应该使用Function.identity()而不是str->str(反之亦然).我认为第二种选择更具可读性(当然是品味问题).但是,有没有"真正的"理由为什么应该首选?
我有一个List<Item>集合.我需要将其转换Map<Integer, Item>
为映射的键必须是集合中项的索引.我无法弄清楚如何使用流来做到这一点.就像是:
items.stream().collect(Collectors.toMap(...));
Run Code Online (Sandbox Code Playgroud)
有帮助吗?
由于这个问题被确定为可能重复,我需要补充一点,我的具体问题是 - 如何获取列表中项目的位置并将其作为键值
这是我的清单:
List<Card> cards;
Run Code Online (Sandbox Code Playgroud)
我想在其中创建地图的 Java-8 流
Map<String, Integer> cardsMap = cards.stream().collect(Collectors.groupingBy(Card::getCardValue, amount of cards that are grouped));
Run Code Online (Sandbox Code Playgroud)
这显然行不通,但我不知道否则我会如何做。
我目前正在处理List<Map<String, Object>>我试图在地图中的各种键之间进行分组的位置.这似乎很好地使用Java 8 Stream:
Map<Object, Map<Object, List<Map<String, Object>>>> collect =
list
.stream()
.collect(Collectors.groupingBy(
item -> item.get("key1"),
Collectors.groupingBy(item -> item.get("key2"))
));
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这给了我一个Map<Object, Map<Object, List<Map<String, Object>>>>在可能的分组结果大于1的情况下运行良好的情况.
我有各种例子,例如,正在进行的分组总是会导致最低级别列表中的单个项目.
行列表
{
[reference="PersonX", firstname="Person", dob="test", lastname="x"],
[reference="JohnBartlett", firstname="John", dob="test", lastname="Bartlett"]
}
Run Code Online (Sandbox Code Playgroud)
通过引用分组
目前 - 分组为1列表 Map<String,Object>
[PersonX, { [reference="PersonX", firstname="Person", dob="test", lastname="x"]}],
[JohnBartlett, { [reference="JohnBartlett", firstname="John", dob="test", lastname="Bartlett"]}]
Run Code Online (Sandbox Code Playgroud)
偏好 - 没有列表只是一个 Map<String,Object>
[PersonX, [reference="PersonX", firstname="Person", dob="test", lastname="x"]],
[JohnBartlett, [reference="JohnBartlett", firstname="John", dob="test", lastname="Bartlett"]]
Run Code Online (Sandbox Code Playgroud)
在流中是否有一种方法可以强制这些实例的输出Map<Object, Map<Object, Map<String, Object>>>- …
我有一个stream<A>,在哪里
class A {
String category();
// ...
}
Run Code Online (Sandbox Code Playgroud)
我想得到一个map<String, list<A>>,基于category()的值将原始流划分为子列表.使用for循环实现它是非常简单的,但是有可能获得利用java流的更优雅的解决方案吗?
例:
鉴于{[a, xyz], [a, zyx], [b, abc]},我想得到一张地图:
a -> {[a, xyz], [a, zyx]}
b -> {[b, abc]}
Run Code Online (Sandbox Code Playgroud) 我想使用Stream&Lambda夫妇构建一个Map.
我尝试了很多方法但是我被困了.这是使用Stream/Lambda和经典循环完成它的经典Java代码.
Map<Entity, List<Funder>> initMap = new HashMap<>();
List<Entity> entities = pprsToBeApproved.stream()
.map(fr -> fr.getBuyerIdentification().getBuyer().getEntity())
.distinct()
.collect(Collectors.toList());
for(Entity entity : entities) {
List<Funder> funders = pprsToBeApproved.stream()
.filter(fr -> fr.getBuyerIdentification().getBuyer().getEntity().equals(entity))
.map(fr -> fr.getDocuments().get(0).getFunder())
.distinct()
.collect(Collectors.toList());
initMap.put(entity, funders);
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我只知道如何在列表中收集,但我不能对地图做同样的事情.这就是为什么我必须再次流式传输我的列表以构建第二个列表,最后将所有列表放在一个地图中.我也尝试了'collect.groupingBy'语句,因为它也应该生成一张地图,但我失败了.
我有一个如下列表.
List<Model> models = ....
Run Code Online (Sandbox Code Playgroud)
到现在为止,我这样做了
List<String> anotherlist = models.parallelStream().map(Model::getName).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
现在,我创建了另一张地图
Map<String, Model> modelsMap = new ConcurrentHashMap<String, Model>();
for (final Model model : models) {
modelsMap.put(model.getId(), model);
}
Run Code Online (Sandbox Code Playgroud)
是否有可能当我在models列表上创建并行流时,我可以modelsMap并排准备我而不必models再次遍历列表?并行流只能绑定到一种操作吗?
我在这里有一个清单:
List<QueryStrings> queryStrings
Run Code Online (Sandbox Code Playgroud)
和QueryStrings只是一个简单的类
public class QueryStrings {
private Integer id;
private String rel;
private String impl;
}
Run Code Online (Sandbox Code Playgroud)
我需要将List放入一个HashMap,其中id将是键,我现在这样做,一次循环List一个项:
HashMap<Integer, QueryStrings> queryMap = new HashMap<>();
for (QueryStrings element : queryStrings) {
Integer thisId = Integer.parseInt(element.getId());
queryMap.put(thisId, element);
}
Run Code Online (Sandbox Code Playgroud)
有更好的方法吗?我不想循环每个项目,这可能吗?
编辑:
对不起,我不应该解析整数,所以代码应该是这样的:
HashMap<Integer, QueryStrings> queryMap = new HashMap<>();
for (QueryStrings element : queryStrings) {
queryMap.put(element.getId(), element);
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码,并希望使用java 8将列表转换Long为Map<Long,Long>.
Long globalVal= 10;
List<Long> queryLongs = Arrays.asList(600L,700L,800L);
Map<Long, Long> map = queryLongs.stream().collect(Collectors.toMap(i->i, globalVal)));
Run Code Online (Sandbox Code Playgroud)
当我尝试将列表中的单个值映射为地图的键时,出现错误.
我试图按照Java 8 List 进入 Map并尝试在一个列表中更改 Set to Map
而不是循环(有效)
for (Type t : toSet()) {
map.put(Pair.of(t, Boolean.TRUE), this::methodAcceptingMap);
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下解决方案:
toSet().stream()
.collect(Collectors.toMap(Pair.of(Function.identity(), Boolean.TRUE),
this::methodAcceptingMap));
Run Code Online (Sandbox Code Playgroud)
但在转换时出错:
Type mismatch: cannot convert from Pair<Function<Object,Object>,Boolean>
to Function<? super T,? extends K>
Run Code Online (Sandbox Code Playgroud)
我的地图
private Map<Pair<Type, Boolean>, BiConsumer<Pair<Type, Boolean>, Parameters>> map =
new HashMap<>();
Run Code Online (Sandbox Code Playgroud)