Printing out some fields of the objects of a filtered stream

Viewed 1906

Let's suppose there is a Fox class, which has got name, color and age. Let's assume that I have a list of foxes, and I want to print out those foxes' names, whose colours are green. I want to use streams to do so.

Fields:

  • name: private String
  • color: private String
  • age: private Integer

I have written the following code to do the filtering and Sysout:

foxes.stream().filter(fox -> fox.getColor().equals("green"))
     .forEach(fox -> System.out::println (fox.getName()));

However, there are some syntax issues in my code.

What is the problem? How should I sort it out?

3 Answers

You cannot combine method references with lambdas, just use one:

foxes.stream()
     .filter(fox -> fox.getColor().equals("green"))
     .forEach(fox -> System.out.println(fox.getName()));

or the other:

foxes.stream()
     .filter(fox -> fox.getColor().equals("green"))
     .map(Fox::getName) // required in order to use method reference in the following terminal operation
     .forEach(System.out::println);

Simply use :

foxes.stream().filter(fox -> fox.getColor().equals("green"))
              .forEach(fox -> System.out.println(fox.getName()));

The reason is because you cannot use method references and lambda expressions together.

You can try :

foxes.stream().filter(this::isColorGreen).map(Fox::getName).forEach(System.out::println);


public boolean isColorGreen(Fox fox) {
    return fox.getColor().equals("green");
}
Related