假设我有一个 HashMap,我想将相同的值插入到键列表中。如何使用 Java 8 执行此操作,而无需迭代所有键并插入值?这更多的是一个 Java Streams 问题。
这是执行此操作的直接方法。这是我编写的示例代码,用于演示我想要实现的目标。
public void foo(List<String> keys, Integer value) {
Map<String, Integer> myMap = new HashMap<>();
for (String key : keys) {
myMap.put(key, value);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法使用 Java 8 流来执行上述操作?如何使用 Java 8 流避免 for 循环。谢谢!
[Edit-1] 下面是更好的代码片段。
public void foo() {
Map<String, Integer> myMap = new HashMap<>();
List<String> keys = getKeysFromAnotherFunction();
Integer value = getValueToBeInserted(); // Difficult to show my actual use case. Imagine that some value is getting computed which has to be …Run Code Online (Sandbox Code Playgroud) 在这个答案中,我尝试创建一个静态实用程序方法,使其List成为Map:
public static <K, T> Map<K, T> toMapBy(List<T> list,
Function<? super T, ? extends K> mapper) {
return list.stream().collect(Collectors.toMap(mapper, Function.identity()));
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好.但是,我发现该方法不能在与list.stream().collect(...)表达式相同的上下文中使用.该方法不够灵活.
List<Student> students = Arrays.asList();
Map<Long, Student> studentsById1 = students.stream()
.collect(Collectors.toMap(Student::getId, Function.identity()));
Map<Long, Student> studentsById2 = toMapBy(students, Student::getId);
Map<Long, Person> peopleById1 = students.stream()
.collect(Collectors.toMap(Student::getId, Function.identity()));
Map<Long, Person> peopleById2 = toMapBy(students, Student::getId); // compile error!
Run Code Online (Sandbox Code Playgroud)
在这个例子中,Student是一个子类型,Person并有一个getId返回a 的方法Long.
最后一个语句失败incompatible types: inference variable T has …
我有以下用例:
User Object is as followed:
UserId payload
123 abc1
123 abc2
456 pqr1
456 pqr2
678 xyz1
And after iterating above list<User Object>, Result should be like:
{123=[abc1, abc2], 456=[pqr1,pqr2], 678=[xyz1]}
Run Code Online (Sandbox Code Playgroud)
这样我就可以使用键(123)的值(其他对象的列表)进行进一步处理。最好的方法是什么?
我在下面尝试过,但不确定如果对象大小增加,性能效率如何。
Map<String,List<String>> userMap = new HashMap<String, List<String>>();
for(User user: users) {
String userId = user.getUserId();
List<String> payloads = new ArrayList<String>();
if(userMap.containsKey(userId)) {
payload = userMap.get(userId);
payloads.add(user.getPayload());
userMap.put(userId, payloads);
}
else {
payloads.add(user.getPayload());
userMap.put(user.getUserId(), payloads);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试从 Objects[] 列表中制作一个 Hashmap,但我无法这样做。下面是我写的代码:
List<Object[]> adjustments = query.getResultList();
Map<Integer, BigDecimal> dpaMap = adjustments.stream().collect(Collectors.toMap(a -> (Integer)a[0], a -> (BigDecimal)a[1]));
Run Code Online (Sandbox Code Playgroud)
我知道只有两个字段从查询中返回,它们具有与 Map 中提到的相同的类型,但它不起作用。请在这方面指导我。
提前致谢。
我有一个整数列表, [1,2,3,4,5]我想在应用乘法函数 (*5) 后将其转换为映射,如下所示:
{1 = 5, 2 = 10, 3 = 15, 4 = 20, 5 = 25}
Run Code Online (Sandbox Code Playgroud)
我能够使用流并使用 map 函数来执行乘法,但我对如何将结果转换为 map 感到困惑。
myList.stream().map(n -> n * 5).collect( ... )
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗。
我有一个数组,我想转换为Map,这样数组中的第一个元素是键,第二个元素是值,依此类推.
我正在尝试以下内容:
Arrays.asList("Tamilnadu", "chennai", "Karnataka", "Bengluru")
.stream()
.collect(HashMap::new,
(a, b) -> a.put(b, ""),//value should be next element in array
(a, b) -> a.putAll(b)
);
Run Code Online (Sandbox Code Playgroud)
我的困惑是如何在同一个迭代中获取下一个元素,以便我可以做到a.put(b,nextElementToB).
有人可以通过使用流来帮助解决这个问题,因为我想尝试使用函数式编程吗?迭代将成为这样做的唯一方法吗?
java ×6
java-8 ×4
hashmap ×2
java-stream ×2
lambda ×2
collections ×1
generics ×1
java-10 ×1
java-9 ×1
stream ×1