Java8为集合新增方法总结

众所周知,在Java中,集合类分为两种:单列集合Collection和键值对集合Map。我想只要是个玩Java的,怎么操作这些集合应该都是手到擒来。但是,在Java8中出现了Lambda表达式,因此对这些集合的操作又有了新的API。我这里简单总结一下,供大家参考。

Iterable新增forEach方法

Iterable属于Collection的父接口,因此凡是属于Collection的子类,都可以使用该方法进行元素遍历。

示例代码如下所示:

public class TestList {

    public static void main(String[] args) {

       List<String> list = new ArrayList<>();
       list.add("Tom");
       list.add("Jerry");
       list.add("Spike");
       list.forEach(ele -> System.out.println(ele));
    }
}

执行结果如下图所示:

Iterator新增forEachRemaining方法

有时候我们会使用Iterator的方式来对集合进行遍历,因此,只要能拿到Iterator对象,就可以使用该方法进行迭代器元素的遍历。

示例代码如下所示:

public class TestList {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("Tom");
        list.add("Jerry");
        list.add("Spike");
        Iterator<String> iter = list.iterator();
        iter.forEachRemaining(ele -> System.out.println(ele));
    }
}

执行结果如下图所示:

Collection新增removeIf方法

在Java8中,Collection接口新增了removeIf方法,通过该方法可以按条件删除元素。

示例代码如下所示:

public class TestList {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("Tom");
        list.add("Jerry");
        list.add("Spike");
        list.removeIf(ele -> ele.length() > 3);
        System.out.println(list);
    }
}

执行结果如下图所示:

List新增sort和replaceAll方法

  • sort方法

在Java8中,List接口新增了sort和replaceAll方法,通过sort方法可以对List集合中的元素进行排序。

示例代码如下所示:

public class TestList {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("Tom");
        list.add("Jerry");
        list.add("Alice");
        list.add("Tony");

        list.sort(Comparator.comparing(ele -> ele.length(), (o1, o2) -> o2 - o1));
        System.out.println(list);
    }
}

执行结果如下图所示:

  • replaceAll方法

在Java8中,List接口新增了replaceAll的方法,通过replaceAll方法,可以按照指定的转换规则替换所有的元素。

示例代码如下所示:

public class TestList {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        list.add("Tom");
        list.add("Jerry");
        list.add("Alice");
        list.add("Tony");

        list.replaceAll(ele -> ele + ele.length());
        System.out.println(list);
    }
}

执行结果如下图所示:

Map接口新增方法

  • remove

这里的的remove指的是remove默认方法,而非Map接口中定义的移除指定key的方法。其声明如下:

default boolean remove(Object key, Object value)

对于该默认方法来说,如果key对应的值与传入的value值相等,则移除该key对应的键值对并返回true,如果key对应的值与传入的value值不相等,则移除失败,并返回false。

示例代码如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        boolean isRemoved = map.remove("Tom", 22);
        System.out.println("是否移除成功:" + isRemoved + ", map的值为:" + map);
        isRemoved = map.remove("Spike", 22);
        System.out.println("是否移除成功:" + isRemoved + ", map的值为:" + map);
    }
}

执行结果如下图所示:

  • forEach

forEach方法用来对Map进行遍历。

示例代码如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        map.forEach((key, value) -> {
            System.out.println("key:" + key + ", value:" + value);
        });
    }
}

执行结果如下图所示:

  • getOrDefault

获取某个key对应的值,若key不存在,则返回默认值。

示例代码如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        System.out.println(map.getOrDefault("Jerry", 32));
        System.out.println(map.getOrDefault("Tony", 32));
    }
}

执行结果如下所示:

  • merge

该方法的作用是将传入的值和该key对应的旧值进行合并。如果该key对应的值为空,则直接用新传入的值替代旧值。如果旧值不为空,则根据传入的计算规则、旧值和新值重新计算出一个值。

示例代码如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        System.out.println(map);
        System.out.println("==================================================");
        BiFunction<Integer, Integer, Integer> reMappingFunc = (oldVal, newVal) -> oldVal + newVal;
        map.merge("Tony", 18, reMappingFunc);
        System.out.println(map);
        System.out.println("==================================================");
        map.merge("Tom", 12, reMappingFunc);
        System.out.println(map);
    }
}

执行结果如下图所示:

  • replace

replace方法有两个,分别为:

  1. default V replace(K key, V value):该方法的作用是用传入的值替代该key对应的旧值。与put方法的区别在于,如果map不存在该key的时候,不会进行插入操作。
  2. default boolean replace(K key, V oldValue, V newValue):该方法的作用是在map中找到对应的key-value后,用新值替换掉该key对应的旧值。如果map不存在该key,或根据key取到的值与传入的旧值,都不进行替换,并返回false,表示替换失败

示例代码如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        // Tom存在,因此替换成功
        map.replace("Tom", 28);
        System.out.println(map);
        System.out.println("===================================");
        // Tony不存在,替换失败
        map.replace("Tony", 10);
        System.out.println(map);

        System.out.println("===================================");
        // Tom-28存在,因此可以替换成功
        map.replace("Tom", 28, 32);
        System.out.println(map);
        
        System.out.println("===================================");
        // Tom-24不存在,替换失败
        map.replace("Tom", 24, 41);
        System.out.println(map);
    }
}

执行结果如下图所示:

  • replaceAll

该方法通过传入的计算函数,根据key和value计算出一个新值,并进行替换。

示例代码如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        map.replaceAll((key, val) -> key.length() + val);
        System.out.println(map);
    }
}

执行结果如下图所示:

  • putIfAbsent

该方法的作用是当该key对应的值不存在时进行插入操作,否则返回该key对应的值。

示例代码如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);
        
        // Tom存在,因此无法插入
        map.putIfAbsent("Tom", 28);
        System.out.println(map);

        System.out.println("============================================");
        // Tony不存在,因此成功插入
        map.putIfAbsent("Tony", 32);
        System.out.println(map);
    }
}

执行结果如下图所示:

  • compute

该方法的作用是根据传入的规则对该key对应的旧值进行计算。如果计算出的值不为空,就替换旧值。如果计算出的值为空时,旧值也为空,则不做任何操作,否则删除该key-value键值对。

示例代码如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        // 计算出的值不为空,因此使用计算出的值替换旧值
        map.compute("Tom", (key, val) -> key.length() + val);
        System.out.println(map);

        // 计算出的值为null, 因此移除该键值对
        map.compute("Tom", (key, val) -> null);
        System.out.println(map);
    }
}

执行结果如下图所示:

  • computeIfAbsent

该方法的作用是当对应的key的值为null的时候(key的值为null或key不在map中),根据传入的规则计算一个新值。如果算出的值不能为空,则进行put操作。

示例代码如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        // Tom有值,因此不进行计算
        map.computeIfAbsent("Tom", key -> map.get(key) + key.length());
        System.out.println(map);

        // 计算出的值为null,因此不做任何操作,Tony不会出现在map中
        map.computeIfAbsent("Tony", key -> null);
        System.out.println(map);

        // Tony无值,则进行计算
        map.computeIfAbsent("Tony", key -> (Objects.isNull(map.get(key)) ? 0 : map.get(key)) + key.length());
        System.out.println(map);
    }
}

执行结果如下图所示:

  • computeIfPresent

该方法的作用是,当map中该key对应的值不为空,则计算新值。如果计算出的值不为空,则进行put操作。如果为空,则移除该key。

示例代码如下所示:

public class TestMap {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("Tom", 18);
        map.put("Jerry", 20);
        map.put("Spike", 22);

        // Tom有值,且计算出的值不为空,因此成功替换。
        map.computeIfPresent("Tom", (key, val) -> key.length() + val);
        System.out.println(map);

        // Tom有值,但计算出的值为空,因此移除Tom对应的键值对
        map.computeIfPresent("Tom", (key, val) -> null);
        System.out.println(map);
    }
}

计算结果如下图所示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章