Java's Linq (C#) Equivalent

Given the following collection:

C#

IEnumerable<string> names = new List<string>(new[] { "Alice", "Bob" });

Java

List<String> names = Arrays.asList("Alice", "Bob");

Filter using .Where()

C#

IEnumerable<string> namesStartingWithA = names.Where(name => name.StartsWith("A"));

Java

Stream<String> namesStartWithA = names.stream().filter(name -> name.startsWith("A"));

Mapping/Transformation of items .Select()

C#

IEnumerable<string> namesUppercase = names.Select(name => name.ToUpperInvariant());

Java

Stream<String> namesUppercase = names.stream().map(name -> name.toUpperCase());

Perform ction for each of element .ForEach()

C# (none for IEnumerable<T>). It was said that List has ForEach implementations before LINQ, thus ForEach(action) implementation has been dropped to avoid issue.

See Stackoverflow answer

Java

names.forEach(name -> System.out.println(name));

Ordering

C#

IEnumerable<string> namesOrdered = names.OrderBy(name => name);

Java

Stream<String> namesOrdered = names.stream().sorted((String name1, String name2) -> {
    return name1.compareTo(name2);
});

Grouping

C#

Dictionary<int, List<string>> namesByLength = names
    .GroupBy(name => name.Length)
    .ToDictionary(g => g.Key, g => g.ToList());

Java (not for the faint-hearted)

Map<Integer, List<String>> map = names.stream()
        .collect(Collectors.groupingBy(
                n -> n.length(), 
                Collectors.mapping(String::toString, Collectors.toList())));

References:

  1. Java documentation
  2. MSDN