学习笔记20 Java Collections Framework概览

一、Lists, Sets, and Maps

list按位置对元素排序,元素x在列表中的位置,也称为其索引。一个列表允许重复的元素。list通过其索引来区分相同的对象。

set是无序无重复集合。与列表不同,set没有其元素的位置概念。集合的实现通常针对搜索进行了优化,所以可以快速找到特定的存储值。

map是一个集合,它根据x的一个属性来存储对象x。这意味着映射中的每个元素都是一个键-值对。键是对象的属性,而值是对象本身。映射允许根据其键快速检索一个值。

二、collection的结构

 JCF Iterable<E> 接口定义了迭代存储E类型的元素的集合的方法。Collection接口扩展了可迭代的方法,并添加了许多处理集合的方法。List接口可由所有按位置对其元素进行排序的集合来实现。它定义了按索引添加、删除和检索元素的方法。最后,Set接口作为所有无序集合的接口。Set接口不会向它从集合中继承的方法添加任何方法。

三、Iterable Interface

1、背景知识

我们认为一个lambda表达式是一个对象,就和根据person类创建一个对象一样。那么一个lambda表达式对象的类型怎么确定呢,它属于哪个类呢?

我们定义了一系列接口,虽然接口不能作为一个对象的类名,但是这里我们暂且这么认为,既我们定义的这一系列不同类型的接口对应了不同lambda表达式对象的类型。

The generic interface Function<T, R>  takes a parameter of type T and returns a value of type R . A bi-function takes two parameters and returns  a value: the generic interface BiFunction<T, U, R> takes two parameters of type T and U , in that
order, and returns a value of type R .
It is useful to have a short hand notation for functional types. We will use the notation T→R for the type Function<T, R> and (T, U)→R for the type BiFunction<T, U, R> . Similar shorthand notation will be used for other functional types.There are also functional interfaces that involve the primitive types int , long , and double . For example, the interface IntFunction<R> is the type int →R, the interface LongFunction<R> is the type long
→R, and IntToLongFunction is the type int long .
An operator is a function whose parameters and return value have the same type. A binary operator is an operator that takes two parameters, and a unary operator is an operator that takes a single parameter.
Thus BinaryOperator<T> has type (T, T)→T, the interface UnaryOperator<T> has type T→T, and LongUnaryOperator has type long long .
A consumer takes at least one parameter and returns no result. The interface  Consumer<T> has type T→ void , while the interface BiConsumer<T, U> has type (T, U)→ void .
A supplier is the opposite of a consumer: it takes no parameters and returns a value. The interface Supplier<T> has type ( )→T and IntSupplier has type ( )→ int .
A predicate is a function that returns a boolean value. Thus Predicate<T> has type T→ boolean , while BiPredicate<T, U> has type (T, U)→ boolean .

可以看到,我们根据传入参数和传出参数的数量,定义了不同lambda表达式的类型。

2.forEach method

Iterable<E>接口提供了如下方法:

void forEach(Consumer<? super E> action)

这个方法的语义是:forEach方法接受一个Consumer<? super E> action类型的变量,根据刚刚的知识我们知道这个类型的变量是一个lambda表达式,而这个lambda表达式接受一个是E的超类的参数作为lambda表达式的输入,且不返回值。E是接口Iterable<E>中的类型

假设我们有一个 `List<Integer>` 类型的集合 `list`,我们想要对集合中的每个元素执行某个操作,比如将元素打印出来。我们可以使用 `forEach` 方法来遍历集合并对每个元素执行操作,代码如下:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.forEach((Integer n) -> System.out.println(n));

在这个例子中,lambda 表达式【(Integer n) -> System.out.println(n)】的类型是 `Consumer<? super Integer>`这个lambda表达式接受一个interger类超类的参数作为其参数。

注意,由于 Java 8 的类型推断机制,我们不需要显式地指定参数类型。上面的代码可以简写为:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.forEach(n -> System.out.println(n));

在这个简写的版本中,编译器会根据上下文推断出 lambda 表达式的类型。

3.Iterators

 在刚刚的例子中,我们发现for each方法可以对一个集合中的所有元素做相同操作,但是如果我希望对集合中的某些特定元素做不同操作该怎么办呢?

Iterator<E> iterator()

调用这个方法,我们就对集合创建了一个iterator对象(和之前的forEach不同,foreach是对集合本身操作,这个是根据集合本身,创建一个新对象,对新对象操作),这个对象除了包含集合中的内容之外,还包含了对这些新对象的一些操作方法,我们可以对集合中的元素进行精确操作,其包含的方法如下:

 例子:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.function.Consumer;

/**
 * This program demonstrates Iterators.
 */
public class IteratorDemo {
    public static void main(String[] args) {
        // Array of names.
        String[] names = {"Anna", "Bob", "Carlos", "Debby"};

        // Create list and add names.
        ArrayList<String> nameList = new ArrayList<>();
        for (String name : names) {
            nameList.add(name);
        }

        // Define an action for the "remaining" elements.
        Consumer<String> action = x -> {
            System.out.printf("%s\n", x);
        };

        // Get the iterator to the list.
        Iterator<String> iter = nameList.iterator();

        // Process list elements with the iterator.
        while (iter.hasNext()) {
            String name = iter.next();
            System.out.printf("%s %d\n", name, name.length());
            if (name.equals("Bob")) {
                // Act differently for names after "Bob".
                iter.forEachRemaining(action);
            }
        }
    }
}
Anna 4
Bob 3
Carlos
Debby

这里我们发现,对于bob之后的人,我们做了不一样的操作 。

4.Enhanced For Loop

enhanced for loop 适用于实现可迭代接口的任何类的任何对象。

特别的,我们看一个removeIf的例子:

import java.util.ArrayList;
import java.util.function.Predicate;

/**
 * This program demonstrates the Collection removeIf.
 */
public class FilterDemo {
    public static void main(String[] args) {
        // Array of names.
        String[] names = {"Anna", "Bob", "Carlos", "Debby"};

        // Create list and add names.
        ArrayList<String> nameList = new ArrayList<>();
        for (String name : names) {
            nameList.add(name);
        }

        // Use forEach with lambda expression to print.
        Predicate<String> filter = x -> x.length() <= 4;

        // Remove strings with length at most 4 from nameList
        nameList.removeIf(filter);

        // Print the array list to show remaining strings.
        System.out.println(nameList);
    }
}

这个例子中,我们用lambda表达式创建了一个检查谓词(predicate),将这个lambda表达式作为一个参数传入removeIf函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
框架说白了就是JAVA工作者多年以来总结出的一些开发标准。让我们可以以成功的经验模式来开发我们自已的系统,一般使用框架的好处是 ·在好的框架下,开发者只需要一些必须的代码;他们不需要直接接触底层的API。 这一点很重要。 ·经过良好设计的框架可以为程序提供清晰的结构并且提高程序的内聚性。好清晰的结构使得其他人可以更容易加入项目。 ·一个容易使用的框架可以通过一些例子和文档为用户提供最佳实践。 ·采用成功的框架的代码比自己的代码容易测试 J2EE本身提供了一些框架。比如, Enterprise Java-Beans (EJB) container或者 Servlet engine 而这些框架一般在小工程我们都不会使用,会让我们把大量的时间浪费在开发框架上。 而现在比较流行开源框架,主要是struts,hibernate,spring等 比如struts是在原有mvc基础上实现在代码分离等功能,非常好用。 而hibernate可以把我们的关系型数据库转换成我们在JAVA的面像对像来使用。从而让我们在开发时不需要直接SQL语句,比如database.getName();就可以直接把数据库的用户名取出来。 Spring J2EE框架被大规模地运用到项目,而项目总要负责这些框架以及自己业务代码的连接,使之真正融合到一起。Spring就是专注于这个问题的,它和Hibernate融合的很好。 这三种框架在一起并不冲突,所以现在最常用的框架就是 struts+hibernate+spring就像我们盖房子一样,先把框架搭好,我们在在上面代码就很规范。 Struts框架介绍 : Struts只是一个MVC框架(Framework),用于快速开发Java Web应用。Struts实现的重点在C(Controller),包括ActionServlet/RequestProcessor和我们定制的 Action,也为V(View)提供了一系列定制标签(Custom Tag)。但Struts几乎没有涉及M(Model),所以Struts可以采用JAVA实现的任何形式的商业逻辑。 Spring是一个轻型容器(light-weight container),其核心是Bean工厂(Bean Factory),用以构造我们所需要的M(Model)。在此基础之上,Spring提供了AOP(Aspect-Oriented Programming, 面向层面的编程)的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean工厂的扩展ApplicationContext更加方便我们实 现J2EE的应用;DAO/ORM的实现方便我们进行数据库的开发;Web MVC和Spring Web提供了Java Web应用的框架或与其他流行的Web框架进行集成。 就是说可将两者一起使用,达到将两者自身的特点进行互补。 spring 框架介绍 : 它关注的领域是其他许多流行的Framework未曾关注的。Spring要提供的是一种管理你的业务对象的方法。 Spring既是全面的又是模块化的。Spring有分层的体系结构,这意味着你能选择仅仅使用它任何一个独立的部分,而它的架构又是内部一致。 因此你能从你的学习,得到最大的价值。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。 它的设计从一开始就是要帮助你编易于测试的代码。Spring是使用测试驱动开发的工程的理想框架。 Spring不会给你的工程添加对其他的框架依赖。Spring也许称得上是个一站式解决方案,提供了一个典型应用所需要的大部分基础架构。它还涉及到了其他framework没有考虑到的内容。 尽管它仅仅是一个从2003年2月才开始的开源项目,但Spring有深厚的历史根基。 Spring架构上的好处 在我们进入细节之前,让我们来看看Spring能够给工程带来的种种好处: Spring能有效地组织你的间层对象,不管你是否选择使用了EJB。如果你仅仅使用了Struts或其他为J2EE的 API特制的framework,Spring致力于解决剩下的问题。 Spring能消除在许多工程常见的对Singleton的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的是哪个 魔法般的属性项或系统属性感到不解,为此不得不去读Javadoc甚至源编码?有了Spring,你仅仅需要看看类的JavaBean属性

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值