我有一个Objects
的列表,我想将其转换为Integers
的列表
List<Object> list = new ArrayList<>();
list.add("StringTest");
list.add(10);
list.add(5.9);
list.add(2.5f);
list.add(12L);
... // different datatypes
List<Integer> result = new ArrayList<>();
// convert items from list and add to result
将List<Object>
的不同数据类型的值添加到List<Integer>
我知道How to cast an Object to an int in java?上的标准建议,但我正在寻找一个很好的结构来编写通用的。
答案 0 :(得分:2)
如果您只想添加数字而不处理字符串,那么您可以使用它:
List<Object> list = new ArrayList<>();
list.add("StringTest");
list.add(10);
list.add(5.9);
list.add(2.5f);
list.add(12L);
List<Integer> result = new ArrayList<>();
list.stream().filter(element -> element instanceof Number)
.map(Number.class::cast)
.mapToDouble(Number::doubleValue)
.mapToLong(Math::round)
.mapToInt(Math::toIntExact) // can throw ArithmeticException if long value overflows an int
.forEach(result::add);
如果您还想处理字符串,则需要将list中的字符串替换为具有该长度的int值,然后按上述方法处理。
答案 1 :(得分:2)
您可以使用流来处理Object
类型列表,如下面的代码所示(请点击注释):
//Collect all Number types to ints
List<Integer> output1 = list.stream().
filter(val -> !(val instanceof String)).//filter non-String types
map(val -> ((Number)val).floatValue()).//convert to Number & get float value
map(val -> (int)Math.round(val)).//apply Math.round
collect(Collectors.toList());//collect as List
//Collect all String types to int
List<Integer> output2 = list.stream().
filter(val -> (val instanceof String)).//filter String types
map(val -> (((String)val).length())).//get String lengths
collect(Collectors.toList());//collect as List
//Now, merge both the lists
output2.addAll(output1);
浮动数字需要四舍五入
您需要先使用Number
方法将float
值转换为floatValue()
,然后应用Math.round
,如上所示。
答案 2 :(得分:1)
instanceof
运算符会使这相对简单。
public class Convert {
public static int toInt(Object o) {
if (o instanceof String) {
return ((String)o).length();
} else if (o instanceof Number) {
return Math.round(((Number)o).floatValue());
} else {
return o.hashCode(); // or throw an exception
}
}
}
使用Java 8,您可以使用Stream
转换值。
List<Object> list = new ArrayList<>();
list.add("StringTest");
list.add(10);
list.add(5.9);
list.add(2.5f);
list.add(12L);
List<Integer> result = list.stream().map(Convert::toInt).collect(Collectors.toList());
答案 3 :(得分:0)
使用此功能,您可以在添加到对象列表
的同时添加到整数列表final List<Integer> integerList=new ArrayList<Integer>();
List<Object> list=new ArrayList<Object>(){
public boolean add(Object e) {
if(e instanceof String){
integerList.add(((String)e).length());
}
if (e instanceof Float){
integerList.add(Math.round((float) e));
}
else{
// other cases
}
return super.add(e);
};
};
list.add("StringTest");
list.add(10);
list.add(5.9);
list.add(2.5f);
list.add(12L);