当前位置: 首页 > news >正文

c2c电子商务网站无锡seo排名收费

c2c电子商务网站,无锡seo排名收费,昆明网站推广优化公司,公司网站主页怎么做目录 背景 Lambda表达式的用法 函数式接口 Lambda表达式的基本使用 语法精简 变量捕获 匿名内部类 匿名内部类中的变量捕获 Lambda的变量捕获 Lambda表达式在类集中的使用 Collection接口 List接口 Map接口 总结 背景 Lambda表达式是Java SE 8中的一个重要的新特性.…

目录

背景

Lambda表达式的用法

函数式接口

Lambda表达式的基本使用

语法精简

 变量捕获

匿名内部类

匿名内部类中的变量捕获

Lambda的变量捕获

Lambda表达式在类集中的使用

Collection接口

 List接口

Map接口

总结


背景

Lambda表达式是Java SE 8中的一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口.lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块).Lambda表达式基于数学中的λ演算得名,也可以称为闭包.

Lambda表达式的用法

基本语法:(parameters)->expression或(parameters)->{statements;}

Lambda表达式由三个部分组成:

1.parameters:类似方法中的形参列表,这里的参数是函数式接口里的参数.这里的参数类型可以明确声明也可不声明而由JVM隐含的判断.另外当只有一个推断类型时可以省略掉圆括号.

2.->:可理解为被用于的意思

3.方法体:可以是表达式也可以代码块,是在函数式接口里方法的实现.代码块可返回一个值或什么都不返回,这里的代码块等同于方法中的方法体,如果是表达式,可以返回一个值或者什么都不返回.

举个栗子:

//1.不需要参数,返回值为2

()->2

//2.接收一个参数(数字类型),返回其两倍的值

x -> 2 * x

//3.接收两个参数(数字),并返回它们的和

(x, y) -> x + y

//4.接收2个int型整数,返回它们的乘积

(int x, int y) -> x * y

//5.接收一个string对象,并在控制台打印,不返回任何值(看起来是返回void)

(String s) -> System.out.println(s)

函数式接口

要了解Lambda表达式,首先需要了解什么是函数式接口,函数接口定义:一个接口有且只有一个抽象方法.

注意:

1.如果一个接口有且只有一个抽象方法,那么该接口就是函数式接口

2.如果我们在某个接口上声明了@FunctionalInterface注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的.所以,从某种意义上来说,只要你保证你的接口中只有一个抽象方法,你可以不加这个注解.加上就会自动进行检测的.

定义方式:

@FunctionalInterface
interface NoParameterNoReturn {//注意:只能有一个方法void test();
}

但是这种方法也是可以的:

@FunctionalInterface
interface NoParameterNoReturn {void test();default void test2() {System.out.println("JDK1.8新特性,default默认方法可以有具体的实现");}
}

Lambda表达式的基本使用

首先,我们事先准备好几个接口:

//无返回值无参数
@FunctionalInterface
interface NoParameterNoReturn {void test();
}//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {void test(int a);
}//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {void test(int a, int b);
}//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {int test();
}//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {int test(int a);
}//有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {int test(int a, int b);
}

我们在上面提到过,Lambda可以理解为:Lambda就是匿名内部类的简化,实际上是创建了一个类,实现了接口,重写了接口的方法.

没有使用lambda表达式时的调用方式:

NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn(){@Overridepublic void test() {System.out.println("hello");}
};

具体使用见以下代码:

public class TestDemo {public static void main(String[] args) {NoParameterNoReturn noParameterNoReturn = () -> {System.out.println("无参数无返回值");};noParameterNoReturn.test();OneParameterNoReturn oneParameterNoReturn = (int a) -> {System.out.println("一个参数一个返回值: " + a);};oneParameterNoReturn.test(10);MoreParameterNoReturn moreParameterNoReturn = (int a, int b) -> {System.out.println("多个参数无返回值: " + a + " " + b);};moreParameterNoReturn.test(20, 30);NoParameterReturn noParameterReturn = () -> {System.out.println("有返回值无参数! ");return 40;};//接收函数的返回值int ret = noParameterReturn.test();System.out.println(ret);OneParameterReturn oneParameterReturn = (int a) -> {System.out.println("有返回值且有一个参数");return a;};ret = oneParameterReturn.test(50);System.out.println(ret);MoreParameterReturn moreParameterReturn = (int a, int b) -> {System.out.println("有返回值且有多个参数");return a + b;};ret = moreParameterReturn.test(70, 60);System.out.println(ret);}
}

语法精简

1.参数类型可以省略,如果需要省略,每个参数的类型都需要省略

2.参数的小括号里面只有一个参数,那么小括号可以省略.

3.如果方法体中只有一句代码,那么大括号可以省略.

4.如果方法体中只有一条语句,且是return语句,那么大括号可以省略,且去掉return关键字.

 示例代码:

public static void main(String[] args) {MoreParameterNoReturn moreParameterNoReturn = (a, b) -> {System.out.println("无返回值多个参数,省略参数类型: " + a + " " + b);};moreParameterNoReturn.test(20, 30);OneParameterNoReturn oneParameterNoReturn = a -> {System.out.println("无参数一个返回值, 小括号可以省略: " + a);};oneParameterNoReturn.test(10);NoParameterNoReturn noParameterNoReturn = () -> System.out.println("无参数无返回值,方法体中只有一行代码");noParameterNoReturn.test();//方法体中只有一条语句,且是return语句NoParameterReturn noParameterReturn = () -> 40;int ret = noParameterReturn.test();System.out.println(ret);}

 变量捕获

Lambda表达式中存在标量捕获,了解变量捕获之后,我们才能更好地理解Lambda表达式的作用域.

Java当中的匿名类中,会存在变量捕获.

匿名内部类

匿名内部类就是没有名字的内部类.我们这里只是为了说明变量捕获,所以,匿名内部类只要会使用即可,那么下面来简单看看匿名内部类的使用就好了.

举个简单的例子:

class Test {public void func() {System.out.println("func()");}
}public class TestDemo {public static void main(String[] args) {Test t = new Test() {@Overridepublic void func() {System.out.println("我是匿名内部类,且重写了func这个方法! ");}};t.func();}
}

在上述代码当中的main函数当中,我们看到的就是一个匿名内部类的简单使用.

匿名内部类中的变量捕获

在匿名内部类中,在使用内外的变量时,有两个条件:(要么是常量,要么是未修改的变量

来看一下代码:

public class TestDemo1 {public static void main(String[] args) {int a = 100;Test t1 = new Test() {@Overridepublic void func() {System.out.println("我是匿名内部类,且重写了func这个方法!");System.out.println("我是捕获到变量a==" + a + "我是一个常量, 或者是一个没有改变过值的变量! ");}};t1.func();}
}

在上述代码当中变量a就是捕获的变量.这个变量要么是被final修饰,如果不是被final修饰的 你要保证在使用之前没有修改.如下代码就是错误的代码.

 

public class TestDemo2 {public static void main(String[] args) {int a = 100;Test t2 = new Test() {@Overridepublic void func() {a = 99;System.out.println("我是匿名内部类,且重写了func这个方法!");System.out.println("我是捕获到变量a==" + a + "我是一个常量, 或者是一个没有改变过值的变量! ");}};}
}

该代码直接编译报错.

Lambda的变量捕获

lambda其实就是可以认为是匿名内部类的实现

在lambda表达式中也可以进行变量的捕获,具体我们看一下代码.

@FunctionalInterface
interface NoParameterNoReturn {void test();
}public class TestDemo3 {public static void main(String[] args) {int a = 10;NoParameterNoReturn noParameterNoReturn = () -> {//a = 99;errorSystem.out.println("捕获变量" + a);};noParameterNoReturn.test();}
}

Lambda表达式在类集中的使用

 为了能够让Lambda和java的集合类更好的一起使用,集合当中,也新增了部分接口,以便与Lambda表达式对接.

对应的接口新增的方法
Collectionremovelf() spliterator() stream() parallelStream() forEach()
ListreplaceAll() sort()
Map

getOrDefault() forEach() replaceAll() putlfAbsent() remove() replace()

computeIfAbsent() computeIfPresent() compute() merge()

以上方法的作用可自行查看javaapi.

Collection接口

forEach()方法演示

该方法在接口Iterable当中,原型如下:

default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for(T t : this) {action.accept(t);}
}

该方法表示:对容器中的每个元素执行action指定动作.

public class TestDemo4 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Hello");list.add("bit");list.add("hello");list.add("lambda");list.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {//简单遍历集合中元素System.out.println(s + " ");}});}
}

 输出结果:

我们可以修改为如下代码:

public class TestDemo4 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Hello");list.add("bit");list.add("hello");list.add("lambda");//表示调用一个,不带有参数的方法,其执行花括号内的语句,为原来的函数体内容.list.forEach(s -> System.out.println(s));}
}

 List接口

sort()方法的演示

sort()方法源码:该方法根据c指定的比较规则对容器元素进行排序.

public void sort(Comparator<? super E> c) {final int expectedModCount = modCount;Arrays.sort((E[]) elementData, 0, size, c);if(modCount != expectedModCount) {throw new ConcurrentModificationExpection();}modCount++;
}

使用示例:

public class TestDemo5 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("hello");list.add("bit");list.add("lambda");System.out.println(list);list.sort(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {//这里比较长度return o1.length() - o2.length();}});System.out.println(list);}
}

输出结果:

 

修改为lambda表达式:

public class TestDemo5 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("hello");list.add("bit");list.add("lambda");System.out.println(list);//调用带有两个参数的方法,且返回长度的差值list.sort((str1, str2) -> str1.length() - str2.length());System.out.println(list);}
}

Map接口

HashMap的forEach()

该方法的原型如下:

default void forEach(BiConsumer<? super K, ? super V> action) {Objects.requireNonNull(action);for(Map.Entry<K, V> entry : entrySet()) {K k;V v;try {k = entry.getKey();v = entry.getValue();} catch {//this usually means the entry is no longer in the map.throw new ConcurrentModificationExpection(ise);}action.accept(k, v);}
}

作用是对Map中的每个映射执行action指定操作.

代码示例:

public class TestDemo6 {public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>();map.put(1, "hello");map.put(2, "bit");map.put(3, "hello");map.put(4, "lambda");map.forEach(new BiConsumer<Integer, String>() {@Overridepublic void accept(Integer integer, String s) {System.out.println(integer + " = " + s);}});}
}

输出结果:

 

使用lambda表达式之后的代码:

public class TestDemo6 {public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>();map.put(1, "hello");map.put(2, "bit");map.put(3, "hello");map.put(4, "lambda");map.forEach((k, v) -> System.out.println(k + " = " + v));}
}

总结

lambda表达式的优点很明显,在代码层次上来说,使代码变得非常地简洁.缺点也不明显,代码不易读.

优点:

1.代码简洁,开发迅速

2.方便函数式编程

3.非常容易进行并行运算

4.Java引入了Lambda,改善了集合操作 

缺点:

1.代码可读性变差

2.在非并行计算中,很多计算未有传统的for性能要高

3.不容易进行调试 

http://www.zhongyajixie.com/news/35831.html

相关文章:

  • 网站设计 下拉式菜单怎么做今日热榜
  • wordpress文章格式引用网站seo优化是什么意思
  • 莱芜区网站千锋教育和黑马哪个好
  • 重庆微网站建设常用的搜索引擎有
  • 白云手机网站建设价格郑州seo招聘
  • 做外贸的经常浏览的三个网站seo网站诊断分析报告
  • 网站后台管理规定竞价托管sem服务
  • 做公司的网站凌云seo博客
  • 佛山 做网站最近国际新闻大事20条
  • 做网站用啥软件好百度推广客服
  • 做响应式网站图片需要做几版上海网站建设联系方式
  • 响应式网站建设代理商重庆seo俱乐部联系方式
  • 网站开发需要的技术的流程深圳网络营销推广外包
  • 网上兼职做药师有哪些网站学校网站模板
  • 萝岗网站建设制作seo是怎么优化
  • 2014 网站建设女教师遭网课入侵直播录屏曝光se
  • 做ppt素材的网站有哪些域名查询 站长查询
  • Wordpress可以卸载吗百度seo价格查询系统
  • 企业网站 手机站常见的网络推广方法有哪些
  • 安康做网站电话网站视频播放代码
  • 房地产网站策划书长沙百度快速排名优化
  • 公司网站维护教程seo排名官网
  • netcore网站开发实战360外链
  • 在线seo专业黑帽seo推广
  • 最新深圳疫情最新消息商丘seo
  • 做啥网站最挣钱关键词难易度分析
  • 武汉网上商城网站建设百度百科分类方法
  • 网页设计网站结构图怎么弄宁波seo推广外包公司
  • 网站建设找盖亚科技杭州关键词优化服务
  • %2enet网站开发windows优化大师怎么样