Cách dễ nhất / ngắn nhất để chuyển đổi Java 8 Stream
thành một mảng là gì?
Cách dễ nhất / ngắn nhất để chuyển đổi Java 8 Stream
thành một mảng là gì?
Câu trả lời:
Phương pháp đơn giản nhất là sử dụng toArray(IntFunction<A[]> generator)
phương thức với tham chiếu hàm tạo. Điều này được đề xuất trong tài liệu API cho phương pháp .
String[] stringArray = stringStream.toArray(String[]::new);
Những gì nó làm là tìm một phương thức lấy một số nguyên (kích thước) làm đối số và trả về a String[]
, đó chính xác là những gì (một trong những quá tải của) new String[]
làm.
Bạn cũng có thể tự viết IntFunction
:
Stream<String> stringStream = ...;
String[] stringArray = stringStream.toArray(size -> new String[size]);
Mục đích của việc IntFunction<A[]> generator
là chuyển đổi một số nguyên, kích thước của mảng, sang một mảng mới.
Mã ví dụ:
Stream<String> stringStream = Stream.of("a", "b", "c");
String[] stringArray = stringStream.toArray(size -> new String[size]);
Arrays.stream(stringArray).forEach(System.out::println);
Bản in:
a
b
c
toArray(sz -> new String[sz])
vì vậy tôi không chắc rằng người ta thực sự có thể nói giải pháp nên hay phải là gì.
sz -> new String[sz]
tạo một hàm mới trong đó tham chiếu của hàm tạo không có. Nó phụ thuộc vào mức độ bạn đánh giá Rác Bộ sưu tập Churn tôi đoán.
private
phương thức mới, không thể gây ra sự khuấy động và cả hai phiên bản cần tạo một đối tượng mới. Một tham chiếu tạo ra một đối tượng trỏ trực tiếp vào phương thức đích; lambda tạo ra một đối tượng trỏ vào đối tượng được tạo private
. Một tham chiếu đến một nhà xây dựng vẫn nên hoạt động tốt hơn vì thiếu sự gián tiếp và tối ưu hóa VM dễ dàng hơn, nhưng việc khuấy đảo không liên quan gì đến nó.
Nếu bạn muốn có được một mảng các số nguyên, với các giá trị từ 1 đến 10, từ Luồng, có IntStream theo ý của bạn.
Ở đây chúng tôi tạo Luồng bằng phương thức Stream.of và chuyển đổi Luồng thành IntStream bằng mapToInt. Sau đó, chúng ta có thể gọi phương thức toArray của IntStream.
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();
Đây là điều tương tự, không có Stream, chỉ sử dụng IntStream
int[]array2 = IntStream.rangeClosed(1, 10).toArray();
Bạn có thể chuyển đổi luồng java 8 thành một mảng bằng cách sử dụng khối mã đơn giản này:
String[] myNewArray3 = myNewStream.toArray(String[]::new);
Nhưng trước tiên, hãy giải thích nhiều thứ hơn, hãy tạo một danh sách chuỗi chứa ba giá trị:
String[] stringList = {"Bachiri","Taoufiq","Abderrahman"};
Tạo một luồng từ Mảng đã cho:
Stream<String> stringStream = Arrays.stream(stringList);
bây giờ chúng ta có thể thực hiện một số thao tác trên luồng này Ex:
Stream<String> myNewStream = stringStream.map(s -> s.toUpperCase());
và cuối cùng chuyển đổi nó thành java 8 Array bằng các phương thức sau:
Phương pháp 1-Classic (Giao diện chức năng)
IntFunction<String[]> intFunction = new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
return new String[value];
}
};
String[] myNewArray = myNewStream.toArray(intFunction);
2 -Lambda biểu thức
String[] myNewArray2 = myNewStream.toArray(value -> new String[value]);
3- Phương pháp tham khảo
String[] myNewArray3 = myNewStream.toArray(String[]::new);
Phương pháp tham khảo Giải thích:
Đó là một cách khác để viết một biểu thức lambda rằng nó hoàn toàn tương đương với cách khác.
Chuyển đổi văn bản thành mảng chuỗi trong đó phân tách từng giá trị bằng dấu phẩy và cắt mọi trường, ví dụ:
String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);
Bạn có thể tạo một trình thu thập tùy chỉnh để chuyển đổi một luồng thành mảng.
public static <T> Collector<T, ?, T[]> toArray( IntFunction<T[]> converter )
{
return Collectors.collectingAndThen(
Collectors.toList(),
list ->list.toArray( converter.apply( list.size() ) ) );
}
và sử dụng nhanh chóng
List<String> input = Arrays.asList( ..... );
String[] result = input.stream().
.collect( CustomCollectors.**toArray**( String[]::new ) );
Collectors.groupingBy
để tôi có thể ánh xạ một số thuộc tính thành các mảng của các đối tượng trên mỗi giá trị thuộc tính. Câu trả lời này cho tôi chính xác điều đó. Ngoài ra @DidierL.
Sử dụng toArray(IntFunction<A[]> generator)
phương thức này thực sự là một cách rất thanh lịch và an toàn để chuyển đổi (hoặc chính xác hơn là thu thập) một luồng thành một mảng cùng loại của Luồng.
Tuy nhiên, nếu kiểu của mảng trả về không quan trọng, chỉ cần sử dụng toArray()
phương thức vừa dễ hơn vừa ngắn hơn. Ví dụ:
Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3);
System.out.printf("%s, %s, %s!", args.toArray());
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);
}
}
}
Dùng thử trực tuyến: https://repl.it/@SmaMa/Stream-to-array
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
Integer[] integers = stream.toArray(it->new Integer[it]);
Bạn có thể làm điều đó theo một số cách. Tất cả các cách đều giống nhau về mặt kỹ thuật nhưng sử dụng Lambda sẽ đơn giản hóa một số mã. Hãy nói rằng chúng tôi khởi tạo Danh sách trước bằng Chuỗi, gọi nó là người.
List<String> persons = new ArrayList<String>(){{add("a"); add("b"); add("c");}};
Stream<String> stream = persons.stream();
Bây giờ bạn có thể sử dụng một trong những cách sau.
Sử dụng Lambda Expresiion để tạo StringArray mới với kích thước được xác định.
Chuỗi [] stringArray = stream.toArray (size-> new String [size]);
Sử dụng phương pháp tham khảo trực tiếp.
Chuỗi [] stringArray = stream.toArray (Chuỗi [] :: new);