Let’s now explore the ToDoubleFunction<T>
, ToIntFunction<T>
, and ToLongFunction<T>
functional interfaces. These are used when you want to map an object of type T
to a primitive (double
, int
, or long
) — without boxing.
✅ 1. ToDoubleFunction<T>
@FunctionalInterface
public interface ToDoubleFunction<T> {
double applyAsDouble(T value);
}
🧠 Example:
ToDoubleFunction<String> lengthTimesPi = s -> s.length() * Math.PI;
System.out.println(lengthTimesPi.applyAsDouble("Java")); // Output: ~12.57
✅ Use Case:
- Works perfectly with
.mapToDouble()
in streams:
Stream<String> words = Stream.of("hello", "world");
double sum = words.mapToDouble(lengthTimesPi).sum();
✅ 2. ToIntFunction<T>
@FunctionalInterface
public interface ToIntFunction<T> {
int applyAsInt(T value);
}
🧠 Example:
ToIntFunction<String> stringLength = String::length;
System.out.println(stringLength.applyAsInt("banana")); // Output: 6
✅ Use Case:
List<String> fruits = List.of("apple", "banana", "pear");
int totalChars = fruits.stream()
.mapToInt(stringLength)
.sum();
✅ 3. ToLongFunction<T>
@FunctionalInterface
public interface ToLongFunction<T> {
long applyAsLong(T value);
}
🧠 Example:
ToLongFunction<String> charValueSum = s ->
s.chars().asLongStream().sum();
System.out.println(charValueSum.applyAsLong("abc")); // Output: 97 + 98 + 99 = 294
✅ Use Case:
Used with .mapToLong()
:
Stream<String> data = Stream.of("abc", "xyz");
long total = data.mapToLong(charValueSum).sum();
🔄 Summary Table
Interface | Input Type | Return Type | Use Case |
---|---|---|---|
ToDoubleFunction<T> | T | double | .mapToDouble() in streams |
ToIntFunction<T> | T | int | .mapToInt() in streams |
ToLongFunction<T> | T | long | .mapToLong() in streams |
💡 Why use these?
- ✅ Avoid boxing (
Integer
,Double
,Long
) - ✅ Better performance in streams
- ✅ Cleaner syntax for numeric pipelines