当前位置: 首页 > 知识库问答 >
问题:

用于将流映射到具有标识键的映射的快捷方式

汪天宇
2023-03-14

考虑以下示例代码,通过将每个字符串映射到其长度并打印每个映射条目来处理字符串列表

package com.dbenergie.ndm.bnb.business;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Application {

    public static void main(String[] args) {
        final List<String> strings = Arrays.asList("Hello", "World", "!");

        // 1
        final Map<String, Integer> stringCharacterCountMapping = strings.stream()
                .collect(Collectors.toMap(Function.identity(), String::length));

        stringCharacterCountMapping.entrySet().stream().forEach(System.out::println);
    }
}

现在,我个人发现相当混乱或样板式的是使用函数将每个流条目显式映射为映射的键。identity()(在1处),但是我找到的每个映射收集器都需要一个键映射器--是不是我忽略了某个收集器,或者如果需要的话,我必须定义我自己的收集器?如果有类似的东西

Collectors.toMap(String::length);

共有1个答案

淳于博
2023-03-14

Collectors类中没有不采用KeyMapperTomap方法。我怀疑这是因为在映射中传递的单个参数可能是非常模糊的。值还是键?

你可以很容易地自己写出这样一个收集器:

class MyCollectors {
    public static <K, U> Collector<K, ?, Map<K,U>> toMapWithValueWrapper(Function<? super K, ? extends U> valueMapper) {
        return Collectors.toMap(Function.identity(), valueMapper);
    }
}

注意,签名与collectors.tomap有点不同。只有2个泛型参数。原始的collectors.tomap有3个-T(我们正在收集的类型)、K(键的类型)和U(值的类型)。由于您正在为密钥使用identity函数,因此密钥的类型始终与我们正在收集的类型相同,因此t==k。因此,我们可以消除t

class MyCollectors {
    public static <T extends K, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends U> valueMapper) {
        return Collectors.toMap(Function.identity(), valueMapper);
    }
}

如果您希望允许收集到一个映射,该映射的键类型是您正在收集的类型的超类。

 类似资料:
  • 3.2 快捷键重映射 几乎每个初窥门径的 vimer 都曾为它的键映射欣喜若狂吧,因为它定制起来实在是太简 洁了,却又似能搞出无尽的花样。 快捷键,或称映射,在 Vim 文档中的术语叫 "map",它的基本用法如下: map {lhs} {rhs} map 快捷键 相当于按下的键序列 其中快捷键 {lhs} 不一定是单键,也可能是一个(较短的)按键序列,然后 vim 将其 解释为另一个(可能较长

  • 我有一个实体,看起来像这样: 输入数据是一个

  • 假设我有一组字符串和一个散列函数(或任何单边函数)和一个测试函数。我想用Java8流创建一个从输入字符串到通过测试函数的哈希值的映射。我的问题是如何在中编写? 看来老的for循环是最简洁的解决方案。

  • 问题内容: 我正在创建一个需要存储键值对的程序。该程序需要接受键形式的请求,并返回相应的值。 问题在于每个键有时有多个值,并且map类不允许重复的键。 这些值是数字,因此无法像使用字符串那样有意义地连接这些值。 对于每个键可以有多个数值的事实,是否有任何优雅的解释方法?我希望返回每个数字,而不是随机返回一个数字。 问题答案: $ cat YourMap.java public class Your

  • 在java 8中创建新代码后,我想清除声纳问题。 我的代码: 声纳说: Lambda应该替换为方法引用。方法/构造函数引用比使用lambda更紧凑和可读性,因此是首选。同样,空检查可以替换为对Object::isNull和Object::nonNull方法的引用。 我想要更改映射(arg-

  • 想改进这个问题吗?通过编辑这篇文章添加细节并澄清问题。 我所拥有的是, 我想要的是, 其中,