Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java 8 Filter Array Using Lambda

I have a double[] and I want to filter out (create a new array without) negative values in one line without adding for loops. Is this possible using Java 8 lambda expressions?

In python it would be this using generators:

[i for i in x if i > 0] 

Is it possible to do something similarly concise in Java 8?

like image 908
Makoto Avatar asked Jun 09 '14 01:06

Makoto


2 Answers

Yes, you can do this by creating a DoubleStream from the array, filtering out the negatives, and converting the stream back to an array. Here is an example:

double[] d = {8, 7, -6, 5, -4}; d = Arrays.stream(d).filter(x -> x > 0).toArray(); //d => [8, 7, 5] 

If you want to filter a reference array that is not an Object[] you will need to use the toArray method which takes an IntFunction to get an array of the original type as the result:

String[] a = { "s", "", "1", "", "" }; a = Arrays.stream(a).filter(s -> !s.isEmpty()).toArray(String[]::new); 
like image 52
Alex - GlassEditor.com Avatar answered Sep 24 '22 15:09

Alex - GlassEditor.com


even simpler, adding up to String[],

use built-in filter filter(StringUtils::isNotEmpty) of org.apache.commons.lang3

import org.apache.commons.lang3.StringUtils;

    String test = "a\nb\n\nc\n";     String[] lines = test.split("\\n", -1);       String[]  result = Arrays.stream(lines).filter(StringUtils::isNotEmpty).toArray(String[]::new);     System.out.println(Arrays.toString(lines));     System.out.println(Arrays.toString(result)); 

and output: [a, b, , c, ] [a, b, c]

like image 20
keypoint Avatar answered Sep 23 '22 15:09

keypoint