Issue
This is my code:
List<String[]> salaries = getSalariesByMonth();
//I am using the old way to print the data
for (String[] obj : rates) {
System.out.println("User name: "obj[0]+"--"+"Salary: "+obj[1]); //obj[0] is NAME, obj[1] is SALARY
}
//I am trying to use this way to print the data but unable to do so.
salaries.forEach(s-> System.out.println("print NAME and SALARY"));
How to print the List that contains String array using Lambda. Thank you in advance.
Solution
To convert a for-each loop into a forEach
call the general pattern is:
for (final var x : xs) {
statements;
}
// becomes:
xs.forEach(x -> { statements; });
// with a single statement, braces are optional:
xs.forEach(x -> statement);
A lambda of the form (x, y) -> { statements; }
is mostly equivalent to a method of the form:
… yourMethod(final … x, final … y) {
statements;
}
Return type and parameter type are inferred automatically by the compiler when a lambda is encountered.
So in your case that would be:
salaries.forEach(obj -> System.out.println("User name: "+obj[0]+"--"+"Salary: "+obj[1]));
You could also use streams to first map each object to a string representation and then output each item in a terminal operation:
salaries.stream()
.map(obj -> "User name: "+obj[0]+"--"+"Salary: "+obj[1])
.forEach(s -> System.out.println(s));
Since System.out.println
expects exactly one argument which matches the lambda argument, it could be replaced with a method reference, which can be more readable in some cases: .forEach(System.out::println)
Answered By - knittl
Answer Checked By - Cary Denson (JavaFixing Admin)