深入浅析Java集合框架与λ表达式

  介绍

深入浅析Java集合框架与λ表达式?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

为引入λ表达式,Java8新增了<代码> java.util.funcion包> 函数接口强,这是λ表达式的基础,Java集合框架也新增部分接口,以便与λ表达式对接。

首先回顾一下Java集合框架的接口继承结构:

, 深入浅析Java集合框架与λ表达式

上图中绿色标注的接口类,表示在Java8中加入了新的接口方法,当然由于继承关系,他们相应的子类也都会继承这些新方法。下表详细列举了这些方法。

接口名Java8新加入的方法CollectionremoveIf spliterator()()()流parallelStream () forEach () ListreplaceAll () () MapgetOrDefault排序()forEach () replaceAll () putIfAbsent()删除()替换()computeIfAbsent () computeIfPresent合并计算()()()

这些新加入的方法大部分要用到java.util。功能包下的接口,这意味着这些方法大部分都跟λ表达式相关。我们将逐一学习这些方法。

<强>集合中的新方法

如上所示,接口集合和列表新加入了一些方法,我们以是列表的子类ArrayList为例来说明。了解Java7ArrayList实现原理,将有助于理解下文。

该方法的签名为无效forEach (Consumer<及# 63;超级E>行动),作用是,其消费是中个函数接口,里面只有一个待实现方法无效接受(T T)(后面我们会看的到,这个方法叫什么根本不重要,你甚至不需要记忆它的名字)。

Java7及以前我们可以用增强的为循环实现:

//使用曾强的循环迭代
  ArrayList列表=new ArrayList<祝辞(arrays . aslist(“我,“love",“你:,“too"));
  (字符串str:列表){
  如果(str.length()在3)
  System.out.println (str);
  }

现在使用forEach()方法结合匿名内部类,可以这样实现:

//使用forEach()结合匿名内部类迭代
  ArrayList列表=new ArrayList<祝辞(arrays . aslist(“我,“love",“你:,“too"));
  列表。forEach(新的Consumer () {
  @Override
  公共空间接受(String str) {
  如果(str.length()在3)
  System.out.println (str);
  }
  });

上述代码调用forEach()方法,并使用匿名内部类实现最大接口。到目前为止我们没看到这种设计有什么好处,但是不要忘记λ表达式,使用λ表达式实现如下:

//使用forEach()结合λ表达式迭代
  ArrayList列表=new ArrayList<祝辞(arrays . aslist(“我,“love",“你:,“too"));
  列表。forEach (str→{
  如果(str.length()在3)
  System.out.println (str);
  });

上述代码给forEach()方法传入一个λ表达式,我们不需要知道接受()方法,也不需要知道消费者接口,类型推导帮我们做了一切。

该方法签名为布尔removeIf (Predicate<及# 63;超级E>过滤器),其中谓词是一个函数接口,里面只有一个待实现方法布尔测试(T T)同样的这个方法的名字根本不重要,因为用的时候不需要书写这个名字。

我们知道如果需要在迭代过程冲对容器进行删除操作必须使用迭代器,否则会抛出ConcurrentModificationException,所以上述任务传统的写法是:

//使用迭代器删除列表元素
  ArrayList列表=new ArrayList<祝辞(arrays . aslist(“我,“love",“你:,“too"));
  Iterator它=list.iterator ();
  而(it.hasNext ()) {
  如果(it.next () . length()比;3)//删除长度大于3的元素
  拔除();
  }

现在使用removeIf()方法结合匿名内部类,我们可是这样实现:

//使用removeIf()结合匿名名内部类实现
  ArrayList列表=new ArrayList<祝辞(arrays . aslist(“我,“love",“你:,“too"));
  列表。removeIf(新的Predicate(){//删除长度大于3的元素
  @Override
  公众的布尔测试(String str) {
  返回str.length()在3;
  }
  });

上述代码使用removeIf()方法,并使用匿名内部类实现Precicate接口。相信你已经想到用λ表达式该怎么写了:

//使用removeIf()结合λ表达式实现
  ArrayList列表=new ArrayList<祝辞(arrays . aslist(“我,“love",“你:,“too"));
  列表。removeIf (str→str.length()比;3);//删除长度大于3的元素

使用λ表达式不需要记忆谓词接口名,也不需要记忆测试()方法名,只需要知道此处需要一个返回布尔类型的λ表达式就行了。

深入浅析Java集合框架与λ表达式