【问题标题】:Interate over char array with another int array using streams使用流使用另一个 int 数组迭代 char 数组
【发布时间】:2021-08-20 08:07:16
【问题描述】:

我想在 java 中使用流,例如 .net 中的 LINQ。 我有两个数组,一个是 char 数组,另一个是 int 数组。 现在我使用 foreach 循环循环以使用两个数组打印一条消息,一个保存字符,另一个只是选择字符的位置。

代码如下:

char[] letter = {115, 116, 97, 99, 107, 111, 118, 101, 114, 102, 108, 119, 105, 110, 100, 103, 32 };
int[] pos = {0,1,2,3,4,5,6,7,8,9,10,5,11,16,12,0,16,4,12,13,15};

for(int s:pos){
    System.out.print(letter[s]);
}

我想用流来做这个。

我的想法是做这样的事情。

Arrays.asList(
    0,1,2,3,4,5,6,7,8,9,10,5,11,16,12,0,16,4,12,13,15
)
.stream()
.forEach(p -> p)

所以在 forEach 的 lambda 表达式中使用字母 char 数组,但现在可能会直接使用

letter[p]

【问题讨论】:

  • 如果我让你试试这个 Arrays.stream(pos).forEach(p->System.out.println(letter[p]));

标签: java java-stream


【解决方案1】:

您可以使用map 并按索引访问

public static void main(String[] args) {
    char[] letter = {115, 116, 97, 99, 107, 111, 118, 101, 114, 102, 108, 119, 105, 110, 100, 103, 32 };
    int[] pos = {0,1,2,3,4,5,6,7,8,9,10,5,11,16,12,0,16,4,12,13,15};

    Arrays.stream(pos).map(x -> letter[x]).forEach(System.out::print);
}

输出:

11511697991071111181011141021081111193210511532107105110103

如果您不想创建int[] 数组,可以使用Stream.of()

Stream.of(0,1,2,3,4,5,6,7,8,9,10,5,11,16,12,0,16,4,12,13,15)
      .map(x -> letter[x])
      .forEach(System.out::print);

但输出会是

stackoverflow is king

之所以出现差异,是因为在第一个示例中,流是从一个 int 数组开始的,后来 chars 转换为 int。如果要显示第一个示例中的单词,则将流替换为

Arrays.stream(pos)
      .mapToObj(x -> (char) letter[x])
      .forEach(System.out::print);

【讨论】:

  • 是否可以直接在流中烘焙数组而不在外部声明它们,所以所有内容都在一大块代码中。输出也应该是字母,没有它工作的 MAP
  • 添加这个回答
  • 能不能在map方法里面加字母数组,
  • add inside是什么意思?它已经在方法x -> letter[x] 中。你想在 map 中创建 char 数组吗?
  • @mogren3000 为每个流元素重新创建 char 数组非常昂贵。如果您想将一系列char 值视为常量,请使用既可读又高效的旧惯用解决方案:IntStream.of(0,1,2,3,4,5,6,7,8,9,10,5,11,16,12,0,16,4,12,13,15) .mapToObj("stackoverflwindg "::charAt) .forEach(System.out::print);。如果您想提高效率,请避免对Character 对象进行装箱:IntStream.of(0,1,2,3,4,5,6,7,8,9,10,5,11,16,12,0,16,4,12,13,15) .map("stackoverflwindg "::charAt) .forEach(c -> System.out.print((char)c));
猜你喜欢
  • 2022-12-01
  • 1970-01-01
  • 2021-06-25
  • 2018-12-19
  • 2018-07-31
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多