文档章节

Java 8 Lambda表达式

战地春梦
 战地春梦
发布于 2016/07/08 15:32
字数 840
阅读 42
收藏 7

#Lambda表达式


##1.Lambda表达式 Lambda表达式是一段可以传递的代码,因此他可以执行一次或者多次。

            String array[]={"Harry",
					"Potter",
					"Jack",
					"Tom"};
	List<String> list=Arrays.asList(array);
	//使用lambda遍历
	list.forEach((String) -> System.out.print(String+";"));
	//使用匿名类
	new Thread(new Runnable() {  
	    @Override  
	    public void run() {  
	        System.out.println("this is NimingThread!");  
	    }  
	}).start();;
	//将匿名类转换为lambda表达式
	new Thread(()->System.out.println("this is lambda")).start();

输出为:Harry;Potter;Jack;Tom; this is NimingThread! this is lambda ##2.函数式接口 对于只包含一个抽象方法的接口,可以通过lamba表达式来创建接口的对象,这种接口被称为函数式接口。

            //使用lambda对数组排序
	//方式一
	Arrays.sort(array, (String s1, String s2) -> (s1.compareTo(s2)));  
	//方式二
	Comparator<String> sort = (String s1, String s2) -> (s1.compareTo(s2));  
	Arrays.sort(array, sort);

##3.方法引用 有些时候,想要传递给其他代码的操作已经有实现的方法了。如按钮点击打印对象,如下

	//方式一
	
	button.setAction(event->System.out.println(event));
	
	//方式二:
	button.setOnAction(System.out::println);

::操作符讲方法名和对象或类的名字分隔开来。如下三种情况:

  • 对象::实例方法

  • 类::静态方法

  • 类::实例方法

还可以捕获方法引用中的super对象

static class Test{
	public void test(){
		System.out.println("test!!");
	}
}
static class TestImpl extends Test{

	@Override
	public void test() {
		new Thread(()->super.test()).start();
	}
}

输出为:test!! ##4.构造器引用 构造器引用同方法引用类似,不同的是构造器引用中方法名是new。 例如Test::new 表达Test类的构造器引用。 ##5.变量作用域 通常,我们希望能在lambda表达式的闭合方法或其他类中访问其他的变量

static void sendMessage(String word,int count){
	new Thread(()->{for(int i=0;i<count;i++){
		System.out.print(word+"; ");
	}}).start();
}
//main程序调用
sendMessage("hello world", 5);

输出为:hello world; hello world; hello world; hello world; hello world; 在lambda表达式中并没有定义word,count,使用的是sendMessage的参数变量。原因为一个lambda包含三个部分

  • 一段代码

  • 参数

  • 自由变量的值,“自由”指的是不是参数,并且没有被定义的变量。

所以,此例中lambda有两个自由变量,word和count。 notes:含有自由变量的代码块称为闭包。 ##6.默认方法 Java通过默认方法允许接口包含带有具体实现的方法。

public interface Animal {
public void sleep();
default public void run(){
	System.out.println("I am Running");
}; 
}

如果一个接口中定义了一个默认方法,而另外一个父类或接口又定义了一个同名的方法,解决方法遵循如下规则:

  • 选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具体相同名称和参数的默认方法就会被忽略。

  • 接口冲突。如果一个父接口提供了一个默认方法,而另一个接口特提供了一个具有相同名称和参数的默认方法,那么必须通过在具体类里覆盖方法来解决冲突。

      public class Animal {
      public void run(){
      System.out.println("Animal is running");
      	}
      }
    
      public interface Activity {
      public void sleep();
      default public void run(){
      	System.out.println("Activity is Running");
      }; 
      }
      public class Tiger extends Animal implements Activity{
    
    
      @Override
      public void sleep() {
      // TODO Auto-generated method stub
      System.out.println("Tiger is Sleeping");
      }
      //发生冲突时,重写run方法。
      //	@Override
      //	public void run(){
      //		System.out.println("Tiger is running");
      //	}
      }
    

输出为:Animal is running ##7.接口中的静态方法 在Java 8中可以为接口添加静态方法。

© 著作权归作者所有

上一篇: Git学习
下一篇: K-Means聚类算法
战地春梦
粉丝 5
博文 33
码字总数 24598
作品 0
南充
私信 提问
Lambda 表达式有何用处?如何使用?(针对Java8)

什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个“值”。 如果你想把“一块代码”赋给一个Java变量,应该怎么做呢? 比如,我想把右边那块代码,赋给一个叫做aBlockOfCode的J...

亭子happy
2018/06/06
328
2
Java8 Lambda【简】

Java8 Lambda Lambda是一个表达式,也可以说它是一个匿名函数。然而在使用它或是阅读Lambda代码的时候,却显得并不那么容易。因为它匿名,因为它删减了一些必要的说明信息(比如方法名)。 ...

anlve
2018/03/08
61
0
JVM之动态方法调用:invokedynamic

在本文的前面的姊妹篇中,介绍了Java方法调用的5种操作码中的4种。它们是Java 8和Java 9中方法调用的标准字节码形式。 于是第五个操作码invokedynamic便进入了我们的视线。简单来说,Java 7中...

01/19
0
0
02、Java的lambda表达式和JavaScript的箭头函数

[toc] 前言 在JDK8和ES6的语言发展中,在Java的lambda表达式和JavaScript的箭头函数这两者有着千丝万缕的联系;本次试图通过这篇文章弄懂上面的两个“语法糖”。 简介 Lambda 表达式来源于 ...

weir_will
2018/06/14
0
0
了解一下Java 8 (一)

2015年公司发展迅速,于是大量的时间花费在招聘上。招聘工程师,必然需要了解候选人的技术能力,尤其是对自己使用的技术的了解程度。优秀的工程师都需要知其然,也知其所以然,否则遇到技术难...

TalkingData
2016/01/20
1K
8

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部