В Scala вы можете сделать
val l = List(1, 2, 3)
l.filter(_ > 2) // returns a List[Int]
val s = Set("hello", "world")
s.map(_.length) // returns a Set[Int]
Вопрос в том, почему это полезно?
Коллекции Scala, вероятно, являются единственной существующей структурой коллекций, которая делает это. Сообщество Scala, похоже, согласилось с тем, что эта функциональность необходима. Тем не менее, никто не пропускает эту функциональность на других языках. Пример C # (изменение имени в соответствии с именем Scala):
var l = new List<int> { 1, 2, 3 }
l.filter(i => i > 2) // always returns Iterable[Int]
l.filter(i => i > 2).toList // if I want a List, no problem
l.filter(i => i > 2).toSet // or I want a Set
В .NET я всегда получаю Iterable, и мне решать, что с ним делать. (Это также делает коллекции .NET очень простыми).
Пример Scala с множеством заставляет меня сделать набор длин из набора строк. Но что, если я просто хочу перебрать длины, или создать список длин, или оставить Iterable, чтобы отфильтровать его позже. Создание набора сразу кажется бессмысленным. ( EDIT : collection.view предоставляет более простую функциональность .NET, хорошо)
Я уверен, что вы покажете мне примеры, когда .NET-подход абсолютно неверен или снижает производительность, но я просто не вижу его (использую .NET годами).