如何使用常规数组中的 keys/values 在 Java 8 中创建关联数组?

How to use keys/values from regular array to create associative array in Java 8?

我只是勉强学习 Java 并且需要在 Java 8 中完成一些事情,但我正在努力找出最有效的方法(来自 PHP 背景)。本质上,我试图给它一个常规数组,运行 一些计算,然后将其中一些值保存在保留原始键的新数组中。

所以基本上原始数组是这样的:

0 => 3
1 => 5
2 => 6
3 => 8

并且新数组将是一个关联数组,其中的键是专门分配的,如:

1 => 5
3 => 8

为了帮助自己在我更熟悉的事物中形象化它,我在 PHP 中得到了我需要的一切,它看起来像这样:

$array = array( 8, 3, 2, 9, 1, 15 );

$new_array = array();

foreach ( $array as $key => $value ) {

    // Calculate something and build new array, for example...
    if ( 5 > $value ) {

        $new_value = $value + 5;

        $new_array[ $key ] = $new_value;
    }
}

所以在这个例子中,$new_array 将是:

1 => 8
2 => 7
4 => 6

我发誓我见过一些东西,我可以做一个基本的 for 循环并访问 keyvalue 但我找不到我在哪里读到的,以及我现在发现的所有其他内容都在谈论使用 forEach() 遍历“哈希映射”,所以这似乎是标准方法,但是当我尝试 array.forEach((k, v) -> // Calculations.... 时它告诉我它“找不到符号”对于 array 在该上下文中,它被立即设置为 int[] array = { // numbers }。据我了解,我必须将数组转换为哈希映射才能在 foreach 中使用 key/value 对,但显然我在那里也做错了......

所以我想这是我的问题...

  1. 我可以为此使用基本的 for 循环,还是我需要将数组转换为散列映射才能访问 key/value 对?如何?我不需要使用任何特定的方法,只是寻找最有效的方法。
  2. 由于其他原因我有 import java.util.Arrays; - 我需要导入其他东西吗?

感谢您的帮助。

更新------------------------

澄清一下,稍后我需要再次使用 $new_array 作为源在代码中做类似的事情,所以我需要能够获取密钥而不仅仅是迭代计数。

例如,如果我将 foreach 包装在 while 循环中,第一次以 $array 开始,随后每次设置 $array 作为$new_array到运行再次计算。

所以换句话说,我不能依靠迭代计数来匹配键。

您可以使用常规 for 循环:

int [] array = {8, 3, 2, 9, 1, 15};
Map<Integer, Integer> map = new HashMap<>();

// Print the results
for (int i = 0; i < array.length; i++) {
    if (5 > array[i]) {
        map.put(i, array[i] + 5);
    }
}
        
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + "=>" + entry.getValue());
}

可以使用 Stream API 以函数方式将数组转换为映射:

  • 使用IntStream.range创建整数流
  • 使用 Collectors.toMap 收集到地图中:

对于新地图,filter 操作可以应用于 select 小于 5 的值。

// these imports to be added
import java.util.*;
import java.util.stream.*;

int [] array = {8, 3, 2, 9, 1, 15};
Map<Integer, Integer> map = IntStream.range(0, array.length) // stream of int indexes
                                     .boxed() // stream of Integer
                                     .collect(Collectors.toMap(
                                         i -> i,        // use index as key
                                         i -> array[i]  // get array element as value
                                     ));

Map<Integer, Integer> mapNew = IntStream.range(0, array.length)
                                        .boxed()
                                        .filter(i -> array[i] < 5)
                                        .collect(Collectors.toMap(i -> i, i -> array[i] + 5));

System.out.println("old map:" + map);
// printing each entry in new map using lambda
mapNew.forEach((k, v) -> System.out.println(k + " -> " + v));

// use common for loop by entries
System.out.println("----");
for(Map.Entry<Integer, Integer> entry : mapNew.entrySet()) {
    System.out.println(entry.getKey() + " => " + entry.getValue());
}

输出:

old map:{0=8, 1=3, 2=2, 3=9, 4=1, 5=15}
1 -> 8
2 -> 7
4 -> 6
----
1 => 8
2 => 7
4 => 6