假設,我有一個這樣的貓串列:
[Cat[name="Minnie", age=3], Cat[name="Pixie", age=1], Cat[name="Kazy", age=5]]
還有一個帶有欄位的物件貓:
class Cats {
int MinnieAge;
int PixieAge;
int KazyAge;
}
將年齡映射到此物件的最佳方法是什么?最好避免使用命令式方法并保持其整潔。這可以通過 MapStruct 或流 API 實作嗎?
uj5u.com熱心網友回復:
如果你想使用流,你可以從實作一個收集器開始:
public class CatsCollector implements Collector<Cat, Cats, Cats> {
@Override
public Supplier<Cats> supplier() {
return () -> new Cats();
}
@Override
public BiConsumer<Cats, Cat> accumulator() {
return (cats1, cat) -> {
switch (cat.name){
case "Minnie": cats1.minnieAge = cat.age; break;
case "Pixie": cats1.pixieAge = cat.age; break;
case "Kazy": cats1.kazyAge = cat.age; break;
}
};
}
@Override
public BinaryOperator<Cats> combiner() {
return (cats1, cats2) -> cats1;
}
@Override
public Function<Cats, Cats> finisher() {
return cats1 -> cats1;
}
@Override
public Set<Characteristics> characteristics() {
return Set.of(Characteristics.UNORDERED);
}
}
PS - 這里的組合器更像是一個存根,因為沒有提供組合邏輯的要求。
PPS - 還有一些假設可以簡化訪問修飾符的內容。
那么如果你有這樣的模型:
public class Cats {
int minnieAge;
int pixieAge;
int kazyAge;
@Override
public String toString() {
return "Cats{"
"minnieAge=" minnieAge
", pixieAge=" pixieAge
", kazyAge=" kazyAge
'}';
}
}
您可以使用自定義收集器:
public static void main(String[] args) {
List<Cat> cats = List.of(
new Cat("Minnie", 3),
new Cat("Pixie", 1),
new Cat("Kazy", 5));
Cats catsResult = cats.stream().collect(new CatsCollector());
System.out.println(catsResult);
}
uj5u.com熱心網友回復:
您好,這是我認為最簡單的方法。
1 - 貓類
public class Cat {
String name;
int age;
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
2 - 動物類
public class Animals {
public List<Cat> cats;
public Animals(List<Cat> cats){
this.cats = cats;
}
3 - 任何運行方法的類
private void run(){
new Animals(List.of(
new Cat("Minnie",5),
new Cat("Pixie",2),
new Cat("Kazy",3)
));
}
然后你可以做任何你想做的事。
uj5u.com熱心網友回復:
我會用屬性名稱和年齡定義一個 Cat 類。然后只需將輸入字串決議為 cat 物件并將它們存盤在已經支持流的串列中。請參見下面的示例:
import java.util.*;
class Cat {
public String name;
public int age;
private Cat(String name, int age) { this.name = name; this.age = age;}
public String toString(){
return String.format("Cat[name=\"%s\", age=%d]",name,age);
}
public static List<Cat> parse(String input) {
List cats = new ArrayList();
int i = 0;
while (true) {
i = input.indexOf("name=", i);
if (i < 0) break;
String name = input.substring(i 6, input.indexOf("\"", i 7));
i = input.indexOf("age=", i);
int age = Integer.parseInt(input.substring(i 4, input.indexOf("]", i)));
cats.add(new Cat(name, age));
}
return cats;
}
}
public class Main{
public static void main(String[] args) {
String input = "[Cat[name=\"Minnie\", age=3], Cat[name=\"Pixie\", age=1], Cat[name=\"Kazy\", age=5]]";
List<Cat> cats = Cat.parse(input);
cats.forEach(System.out::println);
cats.stream().filter(e->e.age > 4).forEach(System.out::println);
}
}
輸出:
run:
Cat[name="Minnie", age=3]
Cat[name="Pixie", age=1]
Cat[name="Kazy", age=5]
Cat[name="Kazy", age=5]
BUILD SUCCESSFUL (total time: 0 seconds)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/496067.html
上一篇:如何從application.yaml加載Kafka消費者或生產者屬性?
下一篇:如何垂直回傳arraylist
