java8基本知识的简单介绍

博主:adminadmin 2023-03-18 22:53:08 516

本篇文章给大家谈谈java8基本知识,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Java8的特性有哪些

1、函数式接口

Java 8 引入的一个核心概念是函数式接口(Functional Interfaces)。通过在接口里面添加一个抽象方法,这些方法可以直接从接口中运行。如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。同时,引入了一个新的注解:@FunctionalInterface。可以把他它放在一个接口前,表示这个接口是一个函数式接口。这个注解是非必须的,只要接口只包含一个方法的接口,虚拟机会自动判断,不过最好在接口上使用注解 @FunctionalInterface 进行声明。在接口中添加了 @FunctionalInterface 的接口,只允许有一个抽象方法,否则编译器也会报错。

java.lang.Runnable 就是一个函数式接口。

@FunctionalInterface

public interface Runnable {

public abstract void run();

}

2、Lambda 表达式

函数式接口的重要属性是:我们能够使用 Lambda 实例化它们,Lambda 表达式让你能够将函数作为方法参数,或者将代码作为数据对待。Lambda 表达式的引入给开发者带来了不少优点:在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,Lambda 表达式的应用则使代码变得更加紧凑,可读性增强;Lambda 表达式使并行操作大集合变得很方便,可以充分发挥多核 CPU 的优势,更易于为多核处理器编写代码;

Lambda 表达式由三个部分组成:第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;第二部分为一个箭头符号:-;第三部分为方法体,可以是表达式和代码块。语法如下:

1. 方法体为表达式,该表达式的值作为返回值返回。

(parameters) - expression

2. 方法体为代码块,必须用 {} 来包裹起来,且需要一个 return 返回值,但若函数式接口里面方法返回值是 void,则无需返回值。

(parameters) - { statements; }

例如,下面是使用匿名内部类和 Lambda 表达式的代码比较。

下面是用匿名内部类的代码:

button.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

System.out.print("Helllo Lambda in actionPerformed");

}

});

下面是使用 Lambda 表达式后:

button.addActionListener(

\\actionPerformed 有一个参数 e 传入,所以用 (ActionEvent e)

(ActionEvent e)-

System.out.print("Helllo Lambda in actionPerformed")

);

上面是方法体包含了参数传入 (ActionEvent e),如果没有参数则只需 ( ),例如 Thread 中的 run 方法就没有参数传入,当它使用 Lambda 表达式后:

Thread t = new Thread(

\\run 没有参数传入,所以用 (), 后面用 {} 包起方法体

() - {

System.out.println("Hello from a thread in run");

}

);

通过上面两个代码的比较可以发现使用 Lambda 表达式可以简化代码,并提高代码的可读性。

为了进一步简化 Lambda 表达式,可以使用方法引用。例如,下面三种分别是使用内部类,使用 Lambda 表示式和使用方法引用方式的比较:

//1. 使用内部类

FunctionInteger, String f = new FunctionInteger,String(){

@Override

public String apply(Integer t) {

return null;

}

};

//2. 使用 Lambda 表达式

FunctionInteger, String f2 = (t)-String.valueOf(t);

//3. 使用方法引用的方式

FunctionInteger, String f1 = String::valueOf;

要使用 Lambda 表达式,需要定义一个函数式接口,这样往往会让程序充斥着过量的仅为 Lambda 表达式服务的函数式接口。为了减少这样过量的函数式接口,Java 8 在 java.util.function 中增加了不少新的函数式通用接口。例如:

FunctionT, R:将 T 作为输入,返回 R 作为输出,他还包含了和其他函数组合的默认方法。

PredicateT :将 T 作为输入,返回一个布尔值作为输出,该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(与、或、非)。

ConsumerT :将 T 作为输入,不返回任何内容,表示在单个参数上的操作。

例如,People 类中有一个方法 getMaleList 需要获取男性的列表,这里需要定义一个函数式接口 PersonInterface:

interface PersonInterface {

public boolean test(Person person);

}

public class People {

private ListPerson persons= new ArrayListPerson();

public ListPerson getMaleList(PersonInterface filter) {

ListPerson res = new ArrayListPerson();

persons.forEach(

(Person person) -

{

if (filter.test(person)) {//调用 PersonInterface 的方法

res.add(person);

}

}

);

return res;

}

}

为了去除 PersonInterface 这个函数式接口,可以用通用函数式接口 Predicate 替代如下:

class People{

private ListPerson persons= new ArrayListPerson();

public ListPerson getMaleList(PredicatePerson predicate) {

ListPerson res = new ArrayListPerson();

persons.forEach(

person - {

if (predicate.test(person)) {//调用 Predicate 的抽象方法 test

res.add(person);

}

});

return res;

}

}

3、接口的增强

Java 8 对接口做了进一步的增强。在接口中可以添加使用 default 关键字修饰的非抽象方法。还可以在接口中定义静态方法。如今,接口看上去与抽象类的功能越来越类似了。

默认方法

Java 8 还允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字即可,这个特征又叫做扩展方法。在实现该接口时,该默认扩展方法在子类上可以直接使用,它的使用方式类似于抽象类中非抽象成员方法。但扩展方法不能够重载 Object 中的方法。例如:toString、equals、 hashCode 不能在接口中被重载。

例如,下面接口中定义了一个默认方法 count(),该方法可以在子类中直接使用。

public interface DefaultFunInterface {

//定义默认方法 countdefault int count(){

return 1;

}

}

public class SubDefaultFunClass implements DefaultFunInterface {

public static void main(String[] args){

//实例化一个子类对象,改子类对象可以直接调用父接口中的默认方法 count

SubDefaultFunClass sub = new SubDefaultFunClass();

sub.count();

}

}

静态方法

在接口中,还允许定义静态的方法。接口中的静态方法可以直接用接口来调用。

例如,下面接口中定义了一个静态方法 find,该方法可以直接用 StaticFunInterface .find() 来调用。

public interface StaticFunInterface {public static int find(){

return 1;

}

}

public class TestStaticFun {

public static void main(String[] args){

//接口中定义了静态方法 find 直接被调用

StaticFunInterface.fine();

}

}

java基础都有那些?

一、标识符

java对各种变量、方法和类等要素命名时使用的字符序列成为标识符;通俗点,凡是自己可以起名字的地方都叫标识符,都遵守标识符的规则

1.标识符命名规则:

1)标识符由字符、下划线、美元符或数字组成。

2)标识符应以字符、下划线、美元符开头

3)java标识符大小写敏感,长度无限制

4)约定俗成,java标识符选取应该注意“见名知意”且不能与java语言的关键字(eclipes中带颜色的基本都是关键字)重名

二、关键字

java中一些赋以特定含义,用作专门用途的关键的字符串成为关键字(keyword);且大多数编辑器都会将关键字用特殊方式标出 所有java关键字都是小写英文

一些常用关键字:

三、java的基本数据类型

1.java常量

java的常量值用字符串表示,区分为不同的数据类型。如:整型常量:1234实型常量:3.14字符常量:’a’逻辑常量:true、false字符串常量:”HelloWorld”

注意:

1)区分字符常量和字符串常量

字符常量是单引号引起来的单个,字符串常量是双引号引起来的不限长度

由于java采用Unicode编码,每个字符占两个字节,因而可用天十六进制编码形式表示,当然也可以用一个中文表示(单个中文占用两个字节)

2)”常量”这个名次还会用在另外其他语境中表示值不可变的变量

2.java变量

java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。java程序中每一个变量都属于特定的数据类型,在使用前必需对其进行声明,声明格式为:type varName [=value]例如:int i =100;foloat f=12.3f;double d1,d2,d3=0.123;(声明了三个变量,其中d1,d2是默认值,d3=0.123)String s=”hello”

从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此,每一个变量使用前必需先声明,然后必需进行赋值,才能使用。

1)java变量分类

按被声明的位置划分:

局部变量:方法或语句块内部定义的变量,只能在被定义的方法或语句块内使用

成员变量:方法外部、类的内部定义的变量,可以在整个类中使用,包括类里的方法或语句块内也可以使用

注意:类外面是不能有变量的声明的

按所属的数据类型划分:

基本数据类型变量

引用数据类型变量

四、运算符

java语言支持如下运算符:

算术运算符:+ - * / % ++ --

关系运算符: = = == !=

逻辑运算符:! | ^ ||

位运算符: | ^ ~

赋值运算符:=

拓展赋值运算符:+ = -= *= /=

字符串链接运算符:+

三目条件运算符 ? :

1.算数运算符

注意:

1)

位运算符中的!、、|、^跟罗技运算符相同,只是位运算符是对变量的二进制进行操作,我个人是用不到的,所以不在这里多做介绍

2)

++(—)

在前时先运算再取值

在后时先取值再运算

2.逻辑运算符

例如:

3.扩展赋值运算符

4.字符串连接符

“ + ”运算符两侧的操作数中只要有一个是字符串类型,系统会自动将另一个操作数转换为字符串然后进行连接,例如:

4 + 5 = 94 + “ab” = “4ab”

5.三目条件运算符

语法格式: x ? y : z 其中x为boolean类型表达式,先计算x的值,若为true,则整个三目运算的结果为表达式y的值,否则整个运算结果为表达式z的值。

五、表达式和语句

1.表达式

表达式是符合一定语法规则的运算符和操作数的序列,例如:a5.0 + a(a – b) * c – 4i 30 i %10 !=0

1)表达式的类型和值

表达式中的操作数进行运算得到的结果称为表达式的值

表达式值的数据类型即为表达式的类型

2)表达式的运算顺序

应按照运算符的优先级从高到低的顺序进行

优先级相同的运算符按照实现约定的结合方式进行

我个人觉得运算顺序这块是可以忽略的,首先我的逻辑思维能力不是特别强,另外我的记性也不是特别好,所以如果我需要在表达式中区分优先级的话我会选择加括号。但是我觉得对于一些比较复杂且关键的逻辑运算,如果个人逻辑运算能力加记忆都比较好可以保证不出错的话,善用罗技运算符优先级未尝不是一种不让别人看懂你代码copy的手段。算是一种小小的防护吧,反正我这种人是不会去尝试分析这种代码的,太累

2.分支(条件)语句

ifif  … elseif  … else if … else ifif  … else if … else  if …else

switch () {case xx:

……………case xx:

……………default:

……………}

1.java中switch语句只能探测int类型的值(char类型的值也可以,因为他可以转换城int类型)

2.小心case穿透,所以最好与break连用

3.多个case可以连用,如下的示例代码也可以这样写(当i=1,2,18都会输出18):

3.循环语句

for(…;…;…){……}while(…){……}先判断再执行大括号里面的内容,然后再判断是否要继续执行do{……} whille(…); 先执行大括号里面的内容再判断是否要继续执行

4.break continue语句

break语句用于终止某个语句块的执行。用在循环体语句中么可以强行退出循环continue语句用在循环体语句中,用于终止某次循环过程,跳过循环中continue语句下面未执行的循环,开始下一次循环过程

八、方法

java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,声明格式:[修饰符1  修饰符2  …] 返回值类型  方法名  (形式参数列表)  {

java语句}

形式参数:在方法被调用时用于接受外界输入的数据

实参:调用方法时实际纯给方法的数据

返回值:方法在执行完毕后返回给调用他的环境的数据

返回值类型:实现约定的返回值的数据类型,如无返回值,必需给出返回值类型void

java语言中调用方法:对象名.方法名(实参列表)

实参的数目、数据类型和次序必需和所调用方法声明的形参列表匹配

return语句终止方法的运行并指定要返回的数据

java中进行函数调用传递参数时,遵循值传递的原则:

基本类型传递的是该数据值本身,引用累心美国传递的是对对象的引用,而不是对象本身

例子中的方法1,前面定义的数据类型为void, 所以方法中不能有return返回值,方法4中因为有return返回值,所以前面必需定义为返回值的类型,也就是m4前面那个int

九、递归调用

递归调用是指在方法执行过程中出现该方法本身的调用

先看一个例子,这是一个简单的递归调用:

简单分析下:

1.首先main主方法中输出字符串,内容是test方法当参数等于5的时候的返回值2.然后将参数5传入test方法,返回值是:5 * test(4)3.再次将参数4传入test方法中,返回值是:4 * test(3)4.再将参数3传入test方法中,返回值是:3 * test(2)5.再讲参数2传入test方法中:返回值是:2 * test(1)6.再将参数1传入到方法中:返回值是:1然后程序开始往回走,返回值传入test(1)中得到2*1再往回走,将刚刚得到的2*1传入到test(2)中得到3*2*1还要往回走,将刚刚得到的3*2*1传入到test(3)中得到4*3*2*1还要往回走,将刚刚得到的4*3*2*1传入到test(4)中也就是test(5)的返回值,得到5*4*3*2*1最后将test5的返回值传入到我们的主方法输出于语句中5*4*3*2*1=120,那么我们的输出语句输出的应该为120

这就是简单的递归调用的例子了

再来看一个例子:

非递归的写法:

请自行领悟

最后奉上java基础语法完整学习路线图,除此之外还有精心整理的其他java学习路线图,学习书籍电子书,阿里巴巴手册,视频教程等即可点此领取:

java8的特性有哪些

Lambda表达式(也称为闭包)它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理

Java 8使用两个新概念扩展了接口的含义:默认方法和静态方法。

方法引用使得开发者可以直接引用现存的方法、Java类的构造方法或者实例对象。方法引用和Lambda表达式配合使用,使得java类的构造方法看起来紧凑而简洁,没有很多复杂的模板代码。

重复注解,Java 8中使用@Repeatable注解定义重复注解

Java 8编译器在类型推断方面有很大的提升,在很多场景下编译器可以推导出某个参数的数据类型,从而使得代码更为简洁。

Java 8拓宽了注解的应用场景。

Java 8增加了很多新的工具类(date/time类),并扩展了现存的工具类,以支持现代的并发编程、函数式编程等。

关于java8基本知识和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。