有很多方法可以做到这一点。但在这里我会解释我的方式:
1。设置IntStream 对象的大小。
首先,只要您有一个List<E> 对象(即E 可能是String、Integers、Objects 等),您可以使用@987654328 将其转换为Map<Integer, E> @ 班级。此类是支持顺序和并行聚合操作的原始 int 值元素序列。这意味着就像一个巨大的柜台。如果我们已经有一个计数器,我们需要设置一些限制,IntStream.range(int start, int end) 方法将帮助我们。此方法将以增量 1 的增量返回从start(包括)到end(不包括)的顺序排列的IntStream。因此,如果您想创建一个大小与我们的List 相同的IntStream,请使用这个:
List<Integer> numbers = Arrays.asList(4, 5, 4, 3);
IntStream stream = IntStream.range(0, numbers.size);
2。根据IntStream对象准备Stream对象。
现在,我们有一个与您的List<E> 一样大小的计数器,但我们需要一个Map<Integer, E>。好吧,现在我们将使用IntStream.boxed()。这个方法返回一个Stream,由这个流的元素组成,每个元素都装箱到一个Integer。这是Stream<Integer>。我们快完成了。
Stream<Integer> streamBoxed = stream.boxed();
3。将Stream 对象转换为Map 对象
最后,我们可以使用Stream.collect() 方法创建地图。此方法对此流的元素执行可变归约操作。如果我们没有Collectors.toMap() 方法的帮助,这种减少会很复杂。此收集器可用于将 Stream 元素收集到 Map 实例中。为此,我们需要提供两个函数:keyMapper 和 valueMapper。 keyMapper 将用于从Stream 元素中提取Map 键,valueMapper 将用于提取与给定<key> 关联的<value>。对于我们的示例,我们将使用Map<Integer, Integer>。 keyMapper 将是我们可以提取的steamBoxed 流的值,使用i -> i,valueMapper 应该是numbers 列表的值,我们将使用i -> numbers.get(i) 得到这些值,如下所示:
Map<Integer, Integer> result = streamBoxed.collect(Collectors.toMap(i -> i, i -> numbers.get(i)))
4。合并所有步骤
这三个部分可以在这个简单的代码中组合在一起:
List<Integer> numbers = Arrays.asList(4, 5, 4, 3);
Map<Integer, Integer> result = IntStream
.range(0, numbers.size); // IntStream
.boxed(); // Stream<Integer>
.collect(Collectors.toMap(i -> i, i -> numbers.get(i))) // Map<Integer, Integer>
另外,你会发现有些作者更喜欢将Function.identity() 方法用作keyMapper,而将numbers::get lambda 表达式用作valueMapper。 他们为什么使用这些表达方式?只是为了偏好。 Function.identity() 方法将始终返回相同的实例。因此,使用Function.identity() 而不是i -> i 可能会节省一些内存。但是,i -> i 比 Function.identity() 更具可读性,但因为创建了自己的实例并具有不同的实现类会消耗更多内存。 :: lambda 表达式只是一个方法引用捕获。
但是,我如何将它应用到我的解决方案中?
嗯,像这样:
final List<String> list;
...
// list initialization;
list = br.lines().collect(Collectors.toList());
...
Map<Integer, String> fileNumWithContentMapper = IntStream
.range(0, list.size()) // IntStream
.boxed() // Stream<Integer>
.collect(Collectors.toMap(i -> i, i -> list.get(i))); // Map<Integer, String>
选择
final List<String> list;
...
// list initialization;
list = br.lines().collect(Collectors.toList());
...
Map<Integer, String> fileNumWithContentMapper = IntStream
.range(0, list.size()) // IntStream
.boxed() // Stream<Integer>
.collect(Collectors.toMap(Function.identity(), list::get)) // Map<Integer, String>