ChatGPT解决这个技术问题 Extra ChatGPT

如何将 Java 8 流转换为数组?

将 Java 8 Stream 转换为数组的最简单/最短的方法是什么?

我建议您恢复回滚,因为问题更完整并且表明您已经尝试过一些东西。
@skiwi 谢谢!但我认为尝试的代码并没有真正为问题添加更多信息,并且没有人尖叫“向我们展示你的尝试”=)
@skiwi:虽然我通常对做我的家庭作业而不是我的问题大喊大叫,但这个特殊的问题对我来说似乎更清楚,没有任何额外的混乱。让我们保持整洁。
您可以在软件包的官方文档中找到很多答案和指导:docs.oracle.com/javase/8/docs/api/java/util/stream/…

J
Jens Bannmann

最简单的方法是将 toArray(IntFunction<A[]> generator) 方法与数组构造函数引用一起使用。这是在 API documentation for the method 中建议的。

String[] stringArray = stringStream.toArray(String[]::new);

它所做的是找到一个接受整数(大小)作为参数的方法,并返回一个 String[],这正是 new String[] 的(其中一个重载)所做的。

您也可以编写自己的 IntFunction

Stream<String> stringStream = ...;
String[] stringArray = stringStream.toArray(size -> new String[size]);

IntFunction<A[]> generator 的目的是将数组大小的整数转换为新数组。

示例代码:

Stream<String> stringStream = Stream.of("a", "b", "c");
String[] stringArray = stringStream.toArray(size -> new String[size]);
Arrays.stream(stringArray).forEach(System.out::println);

印刷:

a
b
c

以下是 Array 构造函数引用实际工作的原因和方式的解释:stackoverflow.com/questions/29447561/…
"Zenexer 是对的,解决方案应该是:stream.toArray(String[]::new);" ...好吧,但是应该明白,方法引用在逻辑上和功能上等价于toArray(sz -> new String[sz]) 所以我不确定是否真的能说出解决方案应该或必须是什么。
@scottb sz -> new String[sz] 创建了一个新函数,而构造函数引用却没有。我猜这取决于您对垃圾收集流失的重视程度。
@WORMSS 它没有。它(静态地!)创建了一个新的private 方法,它不会导致流失,并且两个版本都需要创建一个新对象。引用创建一个直接指向目标方法的对象;一个 lambda 创建一个指向生成的 private 的对象。由于缺乏间接性和更容易的 VM 优化,对构造函数的引用仍然应该表现得更好,但搅动与它无关。
@HTNW 你是对的,我很抱歉。事实上,当我第一次尝试这样做时,正是我尝试调试导致了导致流失的流失,所以我一直认为这就是它的样子。 (当这种情况发生时讨厌它)。
S
S.S. Anne

如果您想从 Stream<Integer> 中获取一个整数数组,其值从 1 到 10,那么您可以使用 IntStream

在这里,我们使用 Stream.of 方法创建 Stream,并使用 mapToIntStream<Integer> 转换为 IntStream。然后我们可以调用 IntStreamtoArray 方法。

Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9,10);
//or use this to create our stream 
//Stream<Integer> stream = IntStream.rangeClosed(1, 10).boxed();
int[] array =  stream.mapToInt(x -> x).toArray();

这是同样的事情,没有 Stream<Integer>,只使用 IntStream

int[]array2 =  IntStream.rangeClosed(1, 10).toArray();

B
Bachiri Taoufiq Abderrahman

您可以使用这个简单的代码块将 java 8 流转换为数组:

 String[] myNewArray3 = myNewStream.toArray(String[]::new);

但是让我们进一步解释一下,首先,让我们创建一个包含三个值的字符串列表:

String[] stringList = {"Bachiri","Taoufiq","Abderrahman"};

从给定的 Array 创建一个流:

Stream<String> stringStream = Arrays.stream(stringList);

我们现在可以对此流执行一些操作,例如:

Stream<String> myNewStream = stringStream.map(s -> s.toUpperCase());

最后使用以下方法将其转换为 java 8 Array:

1-经典方法(功能接口)

IntFunction<String[]> intFunction = new IntFunction<String[]>() {
    @Override
    public String[] apply(int value) {
        return new String[value];
    }
};


String[] myNewArray = myNewStream.toArray(intFunction);

2 -Lambda 表达式

 String[] myNewArray2 = myNewStream.toArray(value -> new String[value]);

3- 方法参考

String[] myNewArray3 = myNewStream.toArray(String[]::new);

方法参考说明:

这是编写 lambda 表达式的另一种方式,它与另一种方式严格等价。


L
Lee Mac

将文本转换为字符串数组,其中每个值用逗号分隔,并修剪每个字段,例如:

String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);

S
Sma Ma
import java.util.List;
import java.util.stream.Stream;

class Main {

    public static void main(String[] args) {
        // Create a stream of strings from list of strings
        Stream<String> myStreamOfStrings = List.of("lala", "foo", "bar").stream();

        // Convert stream to array by using toArray method
        String[] myArrayOfStrings = myStreamOfStrings.toArray(String[]::new);

        // Print results
        for (String string : myArrayOfStrings) {
            System.out.println(string);
        }
    }
}

在线试用:https://repl.it/@SmaMa/Stream-to-array


你的答案和接受的答案有什么区别?
@LongNguyen 这是一个完整的例子,包括一个在线重播场景,而不仅仅是一个片段。
T
Thomas Pliakas

您可以创建将流转换为数组的自定义收集器。

public static <T> Collector<T, ?, T[]> toArray( IntFunction<T[]> converter )
{
    return Collectors.collectingAndThen( 
                  Collectors.toList(), 
                  list ->list.toArray( converter.apply( list.size() ) ) );
}

和快速使用

List<String> input = Arrays.asList( ..... );

String[] result = input.stream().
         .collect( CustomCollectors.**toArray**( String[]::new ) );

为什么要使用它而不是 Stream.toArray(IntFunction)
我需要一个收集器来传递给 2-arg Collectors.groupingBy,以便我可以将某些属性映射到每个属性值的对象数组。这个答案给了我确切的答案。还有@DidierL。
从 Java 11 开始,由于添加了 Collection.toArray​(IntFunction)collectingAndThen 中的 finisher 可以写为 list -> list.toArray(converter)
K
Kunda

使用 toArray(IntFunction<A[]> generator) 方法确实是一种非常优雅且安全的方法,可以将 Stream 转换(或更准确地说,收集)为 Stream 相同类型的数组。

但是,如果返回数组的类型不重要,那么简单地使用 toArray() 方法会更容易并且更短。例如:

    Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3);
    System.out.printf("%s, %s, %s!", args.toArray());

R
Raj N
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);

int[] arr=   stream.mapToInt(x->x.intValue()).toArray();

S
Sagar Mal Shankhala
     Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);

     Integer[] integers = stream.toArray(it->new Integer[it]);

s
said

你可以像这样使用收集器

  Stream<String> io = Stream.of("foo" , "lan" , "mql");
  io.collect(Collectors.toCollection(ArrayList<String>::new));

问题是 [] 不是 ArrayList