Sangjin Kim
Sangjin Kim

Reputation: 1061

Want to create a stream of characters from char array in java

From a char array, I want to construct a stream to use java 8 features such as filters and maps.

char[] list = {'a','c','e'};
Stream<Character> cStream = Stream.of(list);
// Stream<Character> cStream = Arrays.stream(list);

The first method does not work (Reason: change cStream to Stream<char[]>). The commented line does not also work (Reason: The method stream(T[]) in the type Arrays is not applicable for the arguments (char[])).

I know that if char[] list is changed to int[], everything works fine using IntStream. But I do not want to convert every char[] to int[] each time or change into a list when I need to use stream library on char array.

Upvotes: 86

Views: 105914

Answers (10)

branboyer
branboyer

Reputation: 135

Another way not mentioned: make a new String

char[] arr = {'a','c','e'};
new String(arr).chars().mapToObj(i -> (Character) (char) i);

Upvotes: 2

Asif Malek
Asif Malek

Reputation: 307

How about a workaround: char[] list = {'a','c','e'};

Arrays.asList(list).stream();

Upvotes: 1

Fzum
Fzum

Reputation: 2055

"ABCDEFGHIJKLMNOPQRSTUVWXYZ".chars().mapToObj(i -> (char) i);

Upvotes: 1

navnath
navnath

Reputation: 3714

Using Stream Builder:

String inputString = "This is string";
Stream.Builder<Character> charStreamBuilder = Stream.builder();
for (char i :inputString.toCharArray()) {
   charStreamBuilder.accept(i);
 }
 Stream<Character> characterStream = charStreamBuilder.build();

Upvotes: 0

Arpan Saini
Arpan Saini

Reputation: 5191

Getting substream of Characters

 String givenString = "MyNameIsArpan";

       Object[] ints = givenString.chars().mapToObj(i -> (char)i).toArray();

       String subString = Arrays.stream(ints,2,6).
                             map(i -> (char)i).
                             map(String::valueOf).
                             collect(Collectors.joining());

      System.out.println(subString);

OUTPUT : Name

Upvotes: 1

Rakesh Chauhan
Rakesh Chauhan

Reputation: 463

I believe the simplest way to convert to Character stream is

    char[] list = {'a','c','e'};

    Stream<Character> characters = Stream.ofAll(list);

Upvotes: -6

Lars Hartviksen
Lars Hartviksen

Reputation: 1232

A way to do this is via a String object:

char[] list = {'a','c','e'};
Stream<Character> charStream = new String(list).chars().mapToObj(i->(char)i);

I like to do it this way because all the complexity of transforming the array is wrapped into the String creation, and the wrapping of char is also performed behind the scene for me so I can focus on the business logic.

Upvotes: 55

Tagir Valeev
Tagir Valeev

Reputation: 100209

A short and efficient way to create an IntStream from char[] array is to use java.nio.CharBuffer:

char[] list = {'a','c','e'};
IntStream stream = CharBuffer.wrap(list).chars();

This way you can use an IntStream interpreting the int values as characters. If you want a boxed Stream<Character> (which may be less efficient), use

Stream<Character> stream = CharBuffer.wrap(list).chars().mapToObj(ch -> (char)ch);

Using CharBuffer can be a little bit faster than IntStream.range as it has custom spliterator inside, so it does not have to execute an additional lambda (possibly as slow polymorphic call). Also it refers to the char[] array only once and not inside the lambda, so it can be used with non-final array variable or function return value (like CharBuffer.wrap(getCharArrayFromSomewhere()).chars()).

Upvotes: 38

Alexis C.
Alexis C.

Reputation: 93842

You can use an IntStream to generate the indices followed by mapToObj:

char[] arr = {'a','c','e'};
Stream<Character> cStream = IntStream.range(0, arr.length).mapToObj(i -> arr[i]);

Upvotes: 57

TJ Mazeika
TJ Mazeika

Reputation: 1042

The simplest change you can make to the code is change char[] to Character[].

Another way is to create a new ArrayList of the boxed chars:

char[] list = {'a','c','e'};
List<Character> listArray = new ArrayList<>();
for (char c : list)
    listArray.add(c);
Stream<Character> cStream = listArray.stream();

In addition, you can use Google Guava's Chars class, to replace the for loop with:

List<Character> listArray = Chars.asList(list);

Upvotes: 3

Related Questions