【Algorithm】Java刷题中要熟练使用的容器Api、Stream流、Lambda表达式

news2024/11/26 11:58:33

Java刷题中要熟练使用的Stream流、Lambda表达式、容器Api

  • 1.Stream流
    • 1.概述
    • 2.分类
    • 3.具体用法
      • 流的常用创建方法
  • 2.Lambda表达式
    • 函数式接口
    • Lambda书写语法
    • 方法引用
  • 3.各类Api

1.Stream流

1.概述

Stream Api是「集合操作」的一种简化表达形式。其特点是惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算。

2.分类

参考Java 8 stream 的详细用法,其分类如下:
在这里插入图片描述

  • 无状态:指元素的处理不受之前元素的影响;

  • 有状态:指该操作只有拿到所有元素之后才能继续下去。

  • 非短路操作:指必须处理所有元素才能得到最终结果;

  • 短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果。

3.具体用法

流的常用创建方法

  1. Collection(包括List、Set、Map键和值)下的 stream() 和 parallelStream() 方法获取流
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流
  1. 数组获取流
Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);

还可以
Stream<Integer> stream1=Stream.of(nums);
  1. 使用Stream中的静态方法:of()、iterate()、generate()
Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
 
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);
stream2.forEach(System.out::println); // 0 2 4 6 8 10
 
Stream<Double> stream3 = Stream.generate(Math::random).limit(2);
stream3.forEach(System.out::println);

常用操作:

  1. Collection容器(list[Integer])转换成数组(int[]):将Collection<Integer>类型的容器转换为IntStream,然后再用IntStream.toArray()方法将IntStream转换为int[]数组。
List<Integer> list=new LinkedList<>();
int []arr=list.stream().mapToInt(x->x).toArray();
  1. 数组(int[])转换成Collection容器(list[Integer]):使用Arrays.streamint[]转换成IntStream;使用IntStream中的boxed()装箱,将IntStream转换成Stream<Integer>;使用Streamcollect(),将Stream<T>转换成List<T>,因此正是List<Integer>
int []data=new int[10];
List<Integer> list=Arrays.stream(data).boxed().collect(Collectors.toList());

2.Lambda表达式

Lambda表达式是「创建匿名内部类对象」的一种简化方式。

Lambda表达式常见的用法就是将其创建的对象作为参数传递给方法。

函数式接口

Lambda表达式的目标类型必须是「函数式接口」,函数式接口是只包含一个抽象方法的接口,可以使用@FunctionalInterface 注解进行检查。函数式接口可以包含多个默认方法、类方法,但仅能声明一个抽象方法。感性理解来看,实现接口中的抽象方法,我们就能使用该被实现的接口创建匿名内部类对象,正是对这个过程进行简化。例如:

//自定义函数式接口
@FunctionalInterface
interface eat {
  void eatFood();
}


public static void main(String[] args) {	
	//override实现抽象方法,创建匿名内部类
    eat e1 = new eat(){
	  	@Override
	  	public void eatFood(){
	  		System.out.println("传统方法创建对象");
	  	}
  	};
  	e1.eatFood();
  
   //lambda表达式进行匿名内部类创建简化
   eat e2 = () -> System.out.println("lambda方式创建对象");
   e2.eatFood();
}

自定义函数式接口:

@FunctionalInterface //此注解用来表明是函数式接口
public interface MyInterface<T> {
	//函数式接口中只能有一个抽象方法
	void getValue(T t);
}

//自定义函数的Lambda表达式实现
MyInterface<String> myinter= (x)-> System.out.println(x);

JDK中常用的函数式接口:
在这里插入图片描述
在这里插入图片描述
常见的还有Comparator<T>
更全面的总结可以参考Java8中Function函数式接口详解及使用。

Lambda书写语法

lambda表达式的语法格式如下:

(实现的这个接口中的抽象方法中的形参列表parameters) -> 抽象方法的处理expression;(实现的这个接口中的抽象方法中的形参列表parameters) ->{抽象方法的处理 statements; };
  • 可选参数类型声明:可以不声明参数类型。
  • 可选的参数圆括号:一个参数无需定义圆括号。
  • 可选的方法体大括号:expression只有一条语句,可以不用大括号。
  • 可选的return关键字:expression只有一个返回值,可以不写返回关键字。

无返回值的抽象方法:

//抽象方法无返回值
public interface MyInterface {
    public abstract void show(int a,int b);
}


public class MyTest1 {
    public static void main(String[] args) {
    	//传统的匿名内部类中重写方法
        MyInterface myInter = new MyInterface() {
            @Override
            public void show(int a, int b) {
                System.out.println(a + b);
            }
        };
        myInter.show(20, 30);//50
		
        //简写1:标准的lambda简化,抽象方法实现
        MyInterface myInter1 = (int a, int b) -> {
            System.out.println(a + b);
        };
        myInter1.show(20, 40);//60

        //简写2:省略形参列表中的形参类型
        MyInterface myInter2 = (a, b) -> {
            System.out.println(a + b);//70
        };
        myInter2.show(20, 50);

        //简写3:方法体中只有一行代码,进行简化
        MyInterface myInter3 = (a, b) -> System.out.println(a + b);
        myInter3.show(20, 60);//80
    }
}

有返回值的抽象方法:

//抽象方法有int返回值
public interface MyInterface {
    public abstract int test(int a,int b);
}

public class MyTest2 {
    public static void main(String[] args) {
    	//传统的匿名内部类写法
        MyInterface test1 = new MyInterface() {
            @Override
            public int test(int a, int b) {
                return a - b;
            }
        };
        System.out.println(test1.test(90, 8));//82

        //简写1:标准的lambda简化,抽象方法实现
        MyInterface test2 = (int a, int b) -> {
            return a - b;
        };
        System.out.println(test2.test(20, 10));//10

        //简写2:省略形参列表中的形参类型
        MyInterface test3 = (a, b) -> {return a - b;};
        System.out.println(test3.test(30, 10));//20

        //简写3:方法中只有一行代码,可以简化,同时去掉return关键字
        MyInterface test4 = (a, b) -> a - b;
        System.out.println(test4.test(40, 10));//30
    }
}


只有一个形参的抽象方法:

//抽象方法只有一个形参
public interface MyInterface {
    public abstract int show(int a);
}

public class MyTest3 {
    public static void main(String[] args) {
    	//传统的匿名内部类写法
        MyInterface myInter = new MyInterface(){
        	@Override
        	public int show(int a){
				return a-20;
			}
        }; 
        System.out.println(myInter.show(20););//0
		
		//简写1:标准的lambda简化,抽象方法实现
		MyInterface myInter1= (int a)->{
			return a-20;
		};
		System.out.println(myInter1.show(30););//10
		
		//简写2:省略形参列表中的形参类型
		MyInterface myInter2=(a)->{
			return a-20;
		};
		System.out.println(myInter2.show(40););//20

		 //简写3:方法中只有一行代码,可以简化,同时去掉return关键字
		 MyInterface myInter3=(a)->a-20;
		 System.out.println(myInter3.show(50););//30

		//简写4:一个形参可以不写圆括号
		MyInterface myInter4=a->a-20;
		System.out.println(myInter4.show(50););//30
    }
}

方法引用

当Lambda方法体中的操作,已经有别的对象或类实现了,就可以尝试引用已实现的方法。

传入方法的参数和方法内部调用方法的入参是一样的。

分类:
在这里插入图片描述
静态方法引用:

Consumer<String> c1 = r -> Integer.parseInt(r);
c1.accept("1");
Consumer<String> c2 =Integer::parseInt;
c1.accept("2");

实例方法引用:

 Consumer<String> ins1 = r -> System.out.print(r);
 c1.accept("1");
 Consumer<String> ins2 =System.out::print;
 c1.accept("2");

对象方法引用:

Comparator<String> comparator = (o1, o2)->o1.compareTo(o2);
System.out.println(comparator.compare("20", "12"));//1

Comparator<String> comparator1 = String::compareTo;
System.out.println(comparator1.compare("20", "12"));//1

构造方法引用:

Consumer<String> n1 = r ->new BigDecimal(r);
 c1.accept("1");
 Consumer<String> n2 =BigDecimal::new;
 c1.accept("2");

3.各类Api

        // list类型转换为数组
        List<Integer> list=new LinkedList<>();
        list.stream().mapToInt(x->x).toArray();

        // 数组转换为list
        int []arr=new int[]{1,2,3};
        Arrays.asList(arr);

        // lambda实现int[]转List<Integer>
        List<Integer> list1= new LinkedList<>();
        Arrays.stream(arr).boxed().collect(Collectors.toList());

        // set类型转换为数组
        Set<Integer> set=new HashSet<>();
        set.stream().mapToInt(x->x).toArray();

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

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

相关文章

maven repositories更新失败

在项目的pom文件中添加以下配置 <repositories><repository><id>alimaven</id><name>Maven Aliyun Mirror</name><url>http://maven.aliyun.com/nexus/content/repositories/central/</url><releases><enabled>tr…

视频批量剪辑软件开发源码+SaaS

工具能力 API 描述 上传素材接口 开发者可通过本接口将使用素材上传至抖音服务器。 上传临时素材接口 上传临时素材接口。 获取素材列表接口 获取素材列表接口。 删除素材接口 删除素材接口。 小程序接口能力 获取小程序接口能力。 模拟webhook事件 模拟webhook事…

基于Python的接口自动化-HTTP接口基本组成和网页构成

目录 引言 1、HTTP简介 2、HTTP原理和网页基础 2.1、 HTTP基本原理 2.2、 HTTP请求过程 2.3、 网页构成 【自动化测试工程师学习路线】 引言 在我们进行接口测试时&#xff0c;了解HTTP接口的基本组成和网页构成是非常重要的。 而Python作为一门功能强大、易学易用的编程…

亚马逊美国站 解压神器减压小玩具CPC认证

解压玩具又称减压玩具Relaxing toys&#xff0c;包括挤压、摔砸、揉捏、旋转等多种类型&#xff0c;主要供成年人使用&#xff0c;帮助释放压力。 当提到解压玩具时&#xff0c;通常指的是一类旨在缓解压力、放松心情的小型玩具。以下是几种常见的解压玩具及其简要介绍&#x…

一键开启GPT 平行时空模式

不知道大家日常使用GPT的时候&#xff0c;在一次会话中是如何完成同类任务的对话的? 简单点来说&#xff0c;假设你已经完成了角色设定&#xff0c;比如你设定GPT是一名文案编辑&#xff0c;那么接下来你会多次给它提交稿件让它进行编辑&#xff0c;那么在多次提交的时候&…

基于jsp+mysql+Spring+mybatis+VUE的SpringBoot电影院会员积分管理系统

运行环境: 最好是java jdk 1.8&#xff0c;我在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以&#xff0c;如果编译器的版本太低&#xff0c;需要升级下编译器&#xff0c;不要弄太低的版本 tomcat服务器环…

【剑指offer专项突破版】数组篇——“C“

文章目录 前言一 . 排序数组中两个数字的和题目分析思路分析法①代码——双指针法②代码——二分查找 二. 数组中和为 0 的三个数题目分析问题转换代码 三. 和大于等于 target 的最短子数组题目分析思路分析代码 四. 乘积小于 K 的子数组题目分析思路分析代码 五. 和为 k 的子数…

2023 年前端 Web 发展趋势

虽然就个人观点&#xff0c;我觉得 Web 开发在最近几年都没什么进展&#xff08;2016 年至 2021 年&#xff09;&#xff0c;但在刚刚过去的 2022 年中确实又出现了一些新的技术。在本文中&#xff0c;我想跟大家聊聊自己看到的最新 Web 开发的发展趋势。相信这波浪潮会继续激发…

PLC采集串口被占用、网口被占用,网络IP地址不能修改、多台设备IP不同网段等问题解决方案

在我们数据采集项目中&#xff0c;经常碰到端口被串口被触摸屏占用&#xff0c;网口被占用&#xff0c;修改IP增加风险&#xff0c;另外增加新的端口需要通过PLC的编程软件组态&#xff0c;涉及到上传下载PLC程序&#xff0c;耗时耗力很不方便。以下是我们总结的项目中解决办法…

JVM-对象布局

JVM中对象布局 通过引入JOL工具&#xff0c;查看对象在JVM中的布局。 <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.14</version></dependency>对象的在JVM中的基本信息 普通…

iconfont字体的引用

官网&#xff1a;giconfont-阿里巴巴矢量图标库iconfont-国内功能很强大且图标内容很丰富的矢量图标库&#xff0c;提供矢量图标下载、在线存储、格式转换等功能。阿里巴巴体验团队倾力打造&#xff0c;设计和前端开发的便捷工具https://www.iconfont.cn/1. 搜索图标&#xff0…

【正点原子STM32连载】 第三十章 ADC实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第三十…

2023最新项目管理软件排行榜!快来了解各大品牌优缺点

项目管理是一个复杂而又多样化的过程。在这个过程中&#xff0c;管理者需要处理大量的信息&#xff0c;规划资源&#xff0c;分配任务和监督进展。为了更好地管理项目&#xff0c;许多企业和组织开始采用项目管理软件。这些软件不仅可以帮助管理者更好地处理信息&#xff0c;还…

让你不再疑惑怎么转换音频格式

你是否有过这样的经历&#xff1f;听到了一首喜欢的歌曲&#xff0c;但是只能在特定的平台或设备上播放&#xff0c;因为它只存在于视频网站或某个应用程序中。或者你想要将一首歌曲作为铃声或者用于其他用途&#xff0c;但是音频文件的格式却不被平台所支持。这是&#xff0c;…

3D数字孪生技术在水利工程上面的应用价值

"农功今可济,水利更毋隳。”水利作为国民经济稳定和谐的重要部分&#xff0c;运用科技化手段对水利项目进行管理&#xff0c;能完美契合智慧水利灾害管理与防治所需。深圳华锐视点利用数字孪生和三维可视化技术搭建的智慧水利可视化管理平台&#xff0c;通过web3d开发建模…

软考A计划-系统架构师-官方考试指定教程-(10/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

传统ERP软件如何SaaS化?

01 ERP和SaaS ERP概念 企业资源计划 (ERP) 系统是许多企业的主干&#xff0c;助力管理整个企业内的会计、采购流程、项目等。对于许多 IT 部门而言&#xff0c;ERP 系统通常意味着大型、昂贵且耗时的部署&#xff0c;并可能需要进行大量硬件或基础设施投资。然而&#xff0c;云…

【算法基础】拓扑排序及实战

一 、概览 这里涉及到图的概念&#xff0c;感兴趣的同学请移驾 –>图<– 下面还有两个相关概念&#xff0c;大概说一下&#xff1a; 1.1 有向无环图 定义&#xff1a;在图论中&#xff0c;如果一个有向图从任意顶点出发无法经过若干条边回到该点&#xff0c;则这个图是…

测试者必知—如何做Web测试?常见测试点总结

目录 前言&#xff1a; 一、Web应用程序 二、功能测试 三、易用性测试&#xff08;界面测试&#xff09; 四、兼容性测试 五、安全性测试 六、性能测试 前言&#xff1a; Web测试是指对基于Web技术的应用程序进行测试&#xff0c;以测试其功能、性能、安全和稳定性等方面的表…

C++使用boost::serialization进行序列化

废话 发现一个比较好玩的东西&#xff0c;boost::serialization序列化操作&#xff0c;简单来说感觉像ofstream和ifstream的升级版&#xff0c;Boost.Serialization 库能够将c项目中的对象转换为一序列的比特&#xff08;bytes&#xff09;&#xff0c;用来保存和加载还原对象…