我有两个列表,我正在尝试使用此列表中的元素创建一个对象。
例如。
["John Wick" , "New York" , 530520 , 560999 ] 和 ["Alex Souza" , "Houston", 556895]
有些列表可能有 1 个数字,有些列表可能有更多数字。
如何创建?
我的建议是:
- 将这些输入作为字符串存储在 ArrayList 中(因此您不必定义长度)
- 将 ArrayList 作为对象构造的输入
- 将字符串解析为整数。
public class Obj {
String name;
String city;
int[] num;
public Obj(ArrayList<String> in){
name = in.get(0);
city = in.get(1);
for(int i = 2; i < in.size(); i++){
num[i-2] = Integer.parseInt(in.get(i));
}
}
}
允许您致电
Obj o = new Obj(inArrayList);
以生成所需的对象,以标识符o
为例。
不要忘记导入java.util.ArrayList
.
记录
在 Java 16+ 中,记录功能是编写类的简短方法,该类的主要目的是透明且不可变地传达数据。您只需定义 ea h 成员字段的类型和名称。编译器隐式创建构造函数、getter、equals
&hashCode
和toString
。
record Person ( String name , String city , List< Integer > numbers ) {}
例示。
Person p = new Person( "John Wick" , "New York" , List.of( 530520 , 560999 ) ) ;
收集。
List< Person > people = new ArrayList<>() ;
people.add( p ) ;
工厂方法
我们可以添加一个static
工厂方法,将您的特定输入转换为Person
对象。我们根据java.time框架建立的命名约定Person.of
命名我们的工厂方法。
int... nums
中的伪省略号(三重句号字符)告诉 Java 允许该类型的一系列参数中的零个、一个或多个。参数作为该类型的数组到达我们。所以在我们的代码中,我们期望一个int
数组,一个int[]
。将该int
数组传递给IntStream.of
将生成一个int
值流。对于这些int
值中的每一个,我们通过调用.boxed()
将其从基元转换为Integer
对象。最后,我们通过调用toList
将这些Integer
对象收集到List< Integer >
中。有了List< Integer >
,我们可以调用Person
记录的构造函数。
package work.basil.demo;
import java.util.List;
import java.util.stream.IntStream;
public record Person(String name , String city , List < Integer > numbers)
{
static Person of ( String name , String city , int... nums )
{
return new Person( name , city , IntStream.of( nums ).boxed().toList() );
}
}
用法:
List < Person > people =
List.of(
Person.of( "John Wick" , "New York" , 530520 , 560999 ) ,
Person.of( "Alex Souza" , "Houston" , 556895 )
);
people.toString() = [Person[name=John Wick, city=New York, numbers=[530520, 560999]], Person[name=Alex Souza, city=Houston, numbers=[556895
]]]