学习笔记20 Java Collections Framework概览

news2024/11/17 5:56:03

一、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函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/797535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++-----stack和queue

本期我们来学习stack和queue 目录 stack介绍 栈的使用 栈的模拟实现 queue介绍 队列的使用 队列的模拟实现 deque 优先级队列 模拟实现 仿函数 全部代码 stack介绍 1. stack 是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除…

亚马逊测评自养号:如何正确选择学习对象与获取可靠技术知识?

亚马逊是一家知名的跨境电商平台&#xff0c;吸引了越来越多的人涉足这个领域。随着商家数量的增加&#xff0c;亚马逊的竞争力也在不断提高。在亚马逊平台上&#xff0c;产品评价对于卖家账号的评估以及产品曝光量、销量等方面具有直接影响。因此&#xff0c;对于任何一个希望…

单路 PWM 控制的高调光比 LED 降压恒流控制器

概述 OC5401 是一款单路 PWM 控制的高调光比降压恒流驱动控制器&#xff0c;PWM 调光比最高可达 10000&#xff1a;1。 OC5401 支持 16-60V 输入电压范围。 OC5401 采用电流滞环控制方式&#xff0c;无需环路补偿。 OC5401 可通过外接电阻设置 LED 输出电流&#xff0c;最…

数据库中的事务处理

MySQL的事务处理&#xff1a;只支持 lnnoDB 和BDB数据表类型 1.事务就是将一组SQL语句放在同一批次内去执行 2.如果一个SQL语句出错&#xff0c;则该批次内的所有SQL都将被取消执行 MySQL的事务实现方法一&#xff1a; select autocommit 查询当前事务提交模式 set a…

【第二套】Java面试题

第二套&#xff1a; 一、JavaScript前端开发 1、下列的代码输出什么&#xff1f; var y 1; if(function f(){}){y typeof f; } console.log(y);正确的答案应该是 1undefined。 JavaScript中if语句求值其实使用eval函数&#xff0c;eval(function f(){}) 返回 function f()…

Web前端 常用布局

Flex布局&#xff08;弹性布局&#xff09; 参考&#xff1a;滑动验证页面 space-between与space-around的区别

Python编程很简单,四步菜鸟到高手(文末送书5本)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

别在找git报错的解决方案啦,多达20条git错误解决方案助你学习工作

1. 找不到Git命令 $ sudo apt-get update $ sudo apt-get install git2. 无法克隆远程仓库 $ git clone https://github.com/username/repo.git3. 无法拉取或推送到远程仓库 $ git pull origin master $ git add . $ git commit -m "Resolve conflicts" $ git pus…

java.lang.ClassNotFoundException: sun.misc.BASE64Decoder

有一个新的应用服务&#xff0c;idea启动应用应用服务时&#xff0c;突然报错java.lang.ClassNotFoundException: sun.misc.BASE64Decoder &#xff0c;然后在网上搜索&#xff0c;说是建议使用apache包&#xff0c;该类新的JRE已经废弃&#xff0c;并从rt.jar包中移除。但是该…

Visual Components数字化工厂仿真软件 衡祖仿真

Visual Components 3D 制造仿真软件可以方便快捷地设计和验证新的生产解决方案&#xff0c;可以向用户提供快速、便捷、真实的智能制造仿真解决方案。 一、数字化工厂产线仿真 VisualComponents仿真软件将离散物流事件仿真、人机协作、机器人工艺仿真和虚拟调试集于一个平台&am…

【Matter】基于Ubuntu 22.04 编译chip-tool工具

前言 编译过程有点曲折&#xff0c;做下记录&#xff0c;过程中&#xff0c;有参考别人写的博客&#xff0c;也看github 官方介绍&#xff0c;终于跑通了~ 环境说明&#xff1a; 首先需要稳定的梯子&#xff0c;可以访问“外网”ubuntu 环境&#xff0c;最终成功实验在Ubunt…

#P1005. [NOIP2010普及组] 导弹拦截

题目描述 经过 1111年的韬光养晦&#xff0c;某国研发出了一种新的导弹拦截系统&#xff0c;凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截。当工作半径为 00时&#xff0c;则能够拦截与它位置恰好相同的导弹。但该导弹拦截系统也存在这样的缺陷&#xff1a;每套系…

L2Cache 核心原理解析

源码地址&#xff1a;L2Cache L2Cache是什么 L2Cache 是一个基于内存、 Redis 、 Spring Cache 实现的满足高并发场景下的分布式二级缓存框架。 L2Cache如何使用 如何使用 L2cache L2Cache架构图 核心逻辑 1、发起 get(key) 请求2、从localCache中get缓存&#xff0c;若存…

C语言获取13位时间戳以及格式化时间戳

定义time_util.h头文件 #ifndef TIME_UTIL_H #define TIME_UTIL_H #include <stdio.h> #include <time.h> #ifdef _WIN32 #include <windows.h> #define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 #else #include <sys/time.h> #endifvoid ge…

DoIP学习笔记系列:(一)DoIP协议概述

文章目录 1. 为什么会有DoIP协议的需求产生?2. DoIP协议入门2.1 传输层协议和网络层服务2.2 物理层和数据链路层2.3 协议介绍2.3.1 报文封装结构2.3.2 端口号2.3.3 DoIP报文格式2.3.3.1 DoIP首部,协议版本号2.3.3.2 DoIP首部,协议版本号取反2.3.3.3 DoIP首部,负载类型2.3.3…

简要介绍 | 自回归生成:探索序列的未来之旅

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对Autoregressive Generation进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 自回归生成&#xff1a;探索序列的未来之旅 Approach - Autoregressive Conditional Generation using Transformer…

Array(20) 和 Array.apply(null, {length: 20})

1.Array(20) 其结果是&#xff1a; 创建了一个长度为20&#xff0c;但元素均为 empty 的数组。 2.Array.apply(null, { length: 20 }) 其结果是&#xff1a; 创建了一个长度为20&#xff0c;但元素均为 undefined 的数组。 3.异同 3.1相同 console.log(arr1[0] arr2[0]) /…

工具推荐:Linux Busybox

文章首发地址 BusyBox是一个开源的、轻量级的、可嵌入式的、多个Unix工具的集合。BusyBox提供了各种Unix工具的实现&#xff0c;包括文件处理工具、网络工具、shell工具、系统管理工具、进程管理工具等等。它被设计为一个小巧、高效、可靠、易于维护的工具&#xff0c;适用于嵌…

iOS--KVO和KVC

KVC 简单介绍 KVC的全称是KeyValueCoding&#xff0c;俗称“键值编码”&#xff0c;可以通过一个key来访问某个属性&#xff1b; KVC提供了一种间接访问其属性方法或成员变量的机制&#xff0c;可以通过字符串来访问对应的属性方法或成员变量&#xff1b; 它是一个非正式的…

数据结构笔记

数据结构笔记 1. 绪论 随着计算机深入到各个领域&#xff0c;它的作用已不再局限于科学计算&#xff0c;而更多的用于控制&#xff0c;管理及数据处理等非数值计算的处理工作。而它加工出理的对象也由纯粹的数值发展到字符&#xff0c;表格和图像等各种具有一定结构的数据。…