在List <objects>上执行整数操作

时间:2017-05-05 05:43:35

标签: java list object type-conversion

我有一个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>

可能是一个很好的自定义实现
  1. 可以根据字符串的长度附加字符串。
  2. 浮动数字需要四舍五入
  3. 我知道How to cast an Object to an int in java?上的标准建议,但我正在寻找一个很好的结构来编写通用的。

4 个答案:

答案 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);