Search code examples
methodsjava-8getjava-streamcollectors

Use Method that returns an Int inside a Stream


I have a simple method :

public int getPrice(String bookingName) 
{
 //return the price of a booking
}

I also have the class :

public class Booking 
{
String name;
...
}

I want to group the bookings in a map(key = name of the booking, value = getPrice(bookingName)) so I did :

public TreeMap<String, Integer> bookingForName() {
    return  bookings.stream().
            collect(Collectors.groupingBy(Booking::getName,Collectors.summingInt(getPrice(Booking::getName))));

}

This doesnt' work it says :

Multiple markers at this line:

- The target type of this expression must be a functional interface
- The method getPrice(String) in the type Manager is not applicable for the arguments `(Booking::getName)`

How can I do? Thanks!


Solution

  • Your getPrice() method takes a String, not a functional interface, so you can't call getPrice(Booking::getName), and even if you could, summingInt doesn't accept an int.

    Change:

    Collectors.summingInt(getPrice(Booking::getName))
    

    to:

    Collectors.summingInt(b -> getPrice(b.getName()))
    

    Also note that Collectors.groupingBy returns a Map, not a TreeMap. If you must have a TreeMap, you should call a different variant of groupingBy.

    public TreeMap<String, Integer> bookingForName() {
        return bookings.stream()
                       .collect(Collectors.groupingBy(Booking::getName,
                                                      TreeMap::new,
                                                      Collectors.summingInt(b -> getPrice(b.getName()))));
    
    }