Java8的这些集合骚操作,你掌握了嘛?,mybatis多表查询原理

public void testRemoveIf() {

List list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

list.removeIf(x -> x % 2 == 0);

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

}

Stream操作

============

具体使用可以参照

public void testStream(){

IntStream stream = IntStream.builder().add(1).add(2).add(3).build();

int max = stream.max().getAsInt();

System.out.println(max);

}

List的replaceAll

===================

Java8为List接口增加了默认的replaceAll方法,需要UnaryOperator来替换所有集合元素,UnaryOperator是一个函数式接口。

default void replaceAll(UnaryOperator operator) {

Objects.requireNonNull(operator);

final ListIterator li = this.listIterator();

while (li.hasNext()) {

li.set(operator.apply(li.next()));

}

}

下面这个示例为每个元素加上3。

public void testReplaceAll(){

List list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

list.replaceAll(x -> x + 3);

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

}

List的sort

=============

Java8为List接口增加了默认的sort方法,需要Comparator对象来控制元素排,我们可以传入Lambda表达式。

default void sort(Comparator<? super E> c) {

Object[] a = this.toArray();

Arrays.sort(a, (Comparator) c);

ListIterator i = this.listIterator();

for (Object e : a) {

i.next();

i.set((E) e);

}

}

下面这个例子将list逆序。

public void testSort() {

List list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

list.sort((x, y) -> y - x);

System.out.println(list);

}

Map的ForEach

===============

Map接口在Java8同样也新增了用于遍历的方法:

default void forEach(BiConsumer<? super K, ? super V> action) {

Objects.requireNonNull(action);

for (Map.Entry<K, V> entry : entrySet()) {

K k;

V v;

try {

k = entry.getKey();

v = entry.getValue();

} catch(IllegalStateException ise) {

// this usually means the entry is no longer in the map.

throw new ConcurrentModificationException(ise);

}

action.accept(k, v);

}

}

该方法接收一个二元的参数,分别对应key和value:

private void print(Map<Integer,String> map){

map.forEach((x , y )-> {

System.out.println("x -> " + x + ", y -> " + y);

});

}

为了接下来测试方便,数据先准备一下:

Map<Integer, String> map = new HashMap<>();

{

map.put(1, “hello”);

map.put(2, “summer”);

map.put(3, “day”);

map.put(4, “tqbx”);

}

Map的remove

==============

Java8新增了一个remove(Object key, Object value)方法。

default boolean remove(Object key, Object value) {

// key存在且key对应的value确实是传入的value才移除

Object curValue = get(key);

if (!Objects.equals(curValue, value) ||

(curValue == null && !containsKey(key))) {

return false;

}

remove(key);

return true;

}

移除key为3且value为day的元素。

@Test

public void testRemove(){

map.remove(3,“day”);

print(map);

}

Map的compute相关方法

===================

Object compute(Object key, BiFunction remappingFunction):该方法使用remappingFunction根据key-value对计算一个新value,情况如下:

  • 只要新value不为null,就使用新value覆盖原value。

  • 如果原value不为null,但新value为null,则删除原key-value对。

  • 如果原value、新value同时为null那么该方法不改变任何key-value对,直接返回null。

Object computeIfAbsent(Object key, Function mappingFunction):

  • 如果传给该方法的key参数在Map中对应的value为null,则使用mappingFunction根据key计算个新的结果。

  • 如果计算结果不为null,则用计算结果覆盖原有的value。

  • 如果原Map原来不包括该key,那么该方法可能会添加一组key-value对。

Object computeIfPresent(Object key, BiFunction remappingFunction):

  • 如果传给该方法的key参数Map中对应的value不为null,该方法将使用remappingFunction根据原key、value计算一个新的结果。

  • 如果计算结果不为null,则使用该结果覆盖原来的value。

  • 如果计算结果为null,则删除原key-value对。

@Test

public void testCompute() {

//key==2 对应的value存在时,使用计算的结果作为新value

map.computeIfPresent(2, (k, v) -> v.toUpperCase());

print(map);

//key==6 对应的value为null (或不存在)时,使用计算的结果作为新value

map.computeIfAbsent(6, (k) -> k + “haha”);

print(map);

}

Map的getOrDefault

====================

default V getOrDefault(Object key, V defaultValue) {

V v;

// key存在或 value存在,则返回对应的value,否则返回defaultValue

return (((v = get(key)) != null) || containsKey(key))

? v
defaultValue;

}

@Test

public void testGetOrDefault(){

// 获取指定key的value,如果该key不存在,则返回default

String value = map.getOrDefault(5, “如果没有key==5的value,就返回这条信息”);

System.out.println(value);

}

Map的merge

=============

default V merge(K key, V value,

BiFunction<? super V, ? super V, ? extends V> remappingFunction) {

Objects.requireNonNull(remappingFunction);

Objects.requireNonNull(value);

// 先获取原值

V oldValue = get(key);

// 原值为null,新值则为传入的value,不为null,则使用function计算,得到新值

V newValue = (oldValue == null) ? value :

remappingFunction.apply(oldValue, value);

// 新值如果为null,则移除原key-value对

if(newValue == null) {

remove(key);

} else {

// 不为null,则替换之

put(key, new

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 免费领取

Value);

}

// 返回新值

return newValue;

}

@Test

public void testMerge(){

// key为2 的值 加上 +add

map.merge(2," + add",(oldval, newVal) -> oldval + newVal);

print(map);

}

Map的putIfAbsent

===================

default V putIfAbsent(K key, V value) {

// 得到原值

V v = get(key);

// 原值为null,则替换新值

if (v == null) {

v = put(key, value);

}

// 返回原值

return v;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值