将对象列表转换为通过检查的整数列表

时间:2018-12-13 17:02:05

标签: java java-8 hashmap java-stream

我想依次获得List个中的Integer个,其值小于5。

我该怎么办?

TreeMap<String,Object> treeMap = new TreeMap<String,Object>();
HashMap<String,Object> map1 = new HashMap<String,Object>();

map1.put("a",1);
map1.put("b","2x");
map1.put("c",5);
map1.put("d",3);
map1.put("e",2);

List<Object> x = new ArrayList<>();

x = map1.values()
       .stream()
       .collect(Collectors.toList());

x.forEach(System.out::println);

2 个答案:

答案 0 :(得分:4)

鉴于映射的所有值都不都是整数,您需要首先检查元素是否为Integer,然后映射它,然后检查它是否小于5,如果是,则打印该元素。

map1.values()
    .stream()
    .filter(e -> e instanceof Integer) // is this number an integer? if yes then you can pass else no
    .map(e -> (Integer)e) // map to integer so we can compare with '<' symbol
    .filter(e -> e < 5) 
    .forEach(System.out::println);

答案 1 :(得分:0)

其他答案似乎没有满足您的部分要求:

  

List个(共Integer个)

所以我会解决这个问题:

List<Integer> sortedList = 
    map1.values ()
        .stream () 
        .filter (Integer.class::isInstance) // keep only Integers
        .map (Integer.class::cast) // cast to Integer
        .filter (i -> i < 5) // keep only values < 5
        .sorted () // sort
        .collect(Collectors.toList()); // collect into a List
System.out.println (sortedList);

输出:

[1, 2, 3]

您还可以生成int数组而不是List<Integer>

int[] sortedArray = 
    map1.values ()
        .stream () 
        .filter (Integer.class::isInstance)
        .mapToInt (Integer.class::cast)
        .filter (i -> i < 5)
        .sorted ()
        .toArray();

输出:

[1, 2, 3]