Java 对列表执行整数运算<;对象>;
我有一个Java 对列表执行整数运算<;对象>;,java,list,object,type-conversion,Java,List,Object,Type Conversion,我有一个对象列表,我想将其转换为整数列表 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<>();
对象列表
,我想将其转换为整数列表
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 List=new ArrayList();
列表。添加(“StringTest”);
增加(10);
列表。添加(5.9);
列表。添加(2.5f);
列表。添加(12L);
... // 不同的数据类型
列表结果=新建ArrayList();
//从列表转换项目并添加到结果
将不同数据类型的列表
中的值添加到列表
我知道上的标准实现,但我正在寻找一个好的结构来编写通用结构。如果只想添加数字而不处理字符串,可以使用以下方法:
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 List=new ArrayList();
列表。添加(“StringTest”);
增加(10);
列表。添加(5.9);
列表。添加(2.5f);
列表。添加(12L);
列表结果=新建ArrayList();
list.stream().filter(元素->元素实例编号)
.map(Number.class::cast)
.mapToDouble(数字::doubleValue)
.mapToLong(数学:圆形)
.mapToInt(Math::toIntExact)//如果长值溢出int,则可以引发算术异常
.forEach(结果::添加);
若您还想处理字符串,那个么您需要用长度为的int值替换列表中的字符串,然后按照上面提到的方式处理 您可以使用streams来处理
对象
类型的列表,如下代码所示(按照注释):
//将所有数字类型收集到整数
List output1=List.stream()。
筛选器(val->!(val instanceof String))。//筛选非字符串类型
映射(val->((Number)val).floatValue())。//转换为数字并获取浮点值
map(val->(int)Math.round(val))。//应用Math.round
collect(Collectors.toList())//作为列表收集
//将所有字符串类型收集到int
List output2=List.stream()。
筛选器(val->(val instanceof String))。//筛选器字符串类型
映射(val->(((字符串)val.length())。//获取字符串长度
collect(Collectors.toList())//作为列表收集
//现在,合并两个列表
output2.addAll(output1);
浮点数需要四舍五入
您需要首先使用
floatValue()
方法将Number
值转换为float
,然后如上所示应用Math.round
。这样,您可以在添加到对象列表的同时将其添加到整数列表中
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);
final List integerList=new ArrayList();
列表=新的ArrayList(){
公共布尔加法(对象e){
if(字符串的e实例){
integerList.add(((String)e).length());
}
if(e浮点实例){
integerList.add(Math.round((float)e));
}
否则{
//其他情况
}
返回super.add(e);
};
};
列表。添加(“StringTest”);
增加(10);
列表。添加(5.9);
列表。添加(2.5f);
列表。添加(12L);
操作符的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
}
}
}
使用Java8,您可以使用流
转换值
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());
List List=new ArrayList();
列表。添加(“StringTest”);
增加(10);
列表。添加(5.9);
列表。添加(2.5f);
列表。添加(12L);
List result=List.stream().map(Convert::toInt).collect(Collectors.toList());
听起来您已经有了如何实施的计划。你有什么问题吗?看起来Java8有一种使用流来处理类型转换的秘密方法。起初,我想写一种方法,可以处理不同的实例的操作。这就是为什么我在考虑一个定制的实现,我可以将
浮点数取整为最接近的值。我希望我能接受多个答案。看起来很棒。但是,您能告诉我是否可以使用Math.round
到最接近的十进制值吗?我已经更新了代码,请看一下使用Math.round
谢谢@javaguy的代码和解释(注释)<代码>流
功能强大,我应该开始使用它们。是的,你是对的,它们非常强大,即它们提供干净/更简单的代码来处理数据
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());