As you know, Java 8 provides lambda expression and stream API. forEach
is one of the them.
List<String> a = ImmutableList.of("a", "b", "c");
a.forEach(s -> {
System.out.println(s);
});
Having side-effect in lambda expression is not recommended because it can be a hinder against thread-safe. For example we sometimes want to add elements into external variable.
List<String> a = ImmutableList.of("a", "b", "c");
List<String> b = new ArrayList<String>();
a.forEach(s -> {
b.add(s);
});
But I found it can be simpler by using method reference like this.
List<String> a = ImmutableList.of("a", "b", "c");
List<String> b = new ArrayList<String>();
a.forEach(b::add);
Assert.assertEquals(3, b.size());
So method reference is a good way to be used any situation in lambda expression.
Filter.
public static boolean isEven(int x) {
return x % 2 == 0;
}
@Test
public void testFilter() {
List<Integer> a = ImmutableList.of(1,2,3,4,5);
List<Integer> b = a.stream()
.filter(TestForEach::isEven)
.collect(Collectors.toList());
Assert.assertEquals(2, b.size());
}
Map.
private static Integer twoTimes(int x) {
return x * x;
}
@Test
public void testMap() {
List<Integer> a = ImmutableList.of(1,2,3,4,5);
List<Integer> b = a.stream()
.map(TestForEach::twoTimes)
.collect(Collectors.toList());
Assert.assertEquals(Integer.valueOf(4), b.get(1));
Assert.assertEquals(Integer.valueOf(25), b.get(4));
}