Совершенно новый вопрос: как в Java получить свойства из одного набора объектов в другой?
В C# я обычно использую отличный синтаксис LINQ для такого рода задач. Вот пример:
List<Hero> Heroes = new List<Hero>()
{
new Hero() { Name = "Iron Man", Superpower = "Being Iron Man, duh", Age = 48 },
new Hero() { Name = "Spider-Man", Superpower = "Spidey things", Age = 16 }
};
List<AlterEgo> AlterEgos = Heroes.Select(x => new AlterEgo { Age = x.Age }).ToList();
После .Select
я получаю два AlterEgo
с Age
s 48 и 16. Есть ли способ сделать это в Java?
Это потрясающе, спасибо! Кроме того, в качестве продолжения: можно ли это сделать с анонимным объектом, чтобы получить набор некоторых свойств? В C# это: `Heroes.Select(x => new { x.Age, x.Name }).ToList();, который внутри становится List<'a>.
В Java на самом деле нет анонимных объектов. Но в Java 10+ вы можете сделать что-то вроде этого: var list = heroes.stream().map(x -> new Object() { int age = x.getAge(); String name = x.getName(); }).collect(Collectors.toList());
Круто, это действительно полезно. Не могли бы вы опубликовать свой комментарий в качестве ответа, чтобы я мог его принять?
Потоки — это Java-параллель LINQ. Вот что хотел бы ваш код на Java с адаптацией стиля и синтаксиса:
List<Hero> heroes = Arrays.asList(
new Hero("Iron Man", "Being Iron Man, duh", 48),
new Hero("Spider-Man", "Spidey things", 16)
);
List<AlterEgo> alterEgos = heroes.stream()
.map(x -> new AlterEgo(x.getAge()))
.collect(Collectors.toList());
Что касается продолжения в комментариях, в Java нет надлежащих анонимных объектов, но вы можете создавать экземпляры анонимные классы и получать доступ к их свойствам, если вы можете избежать именования типа. В Java 10 это немного упрощается с помощью ключевого слова var
:
var list = heroes.stream()
.map(x -> new Object() {
int age = x.getAge();
String name = x.getName();
})
.collect(Collectors.toList());
list.forEach(x -> System.out.println(x.age));
heroes.stream().map(x -> new AlterEgo(x.getAge())).collect(Collectors.toList())