首页 > 编程语言 >java程序new对象后加大括号{},匿名类,闭包,lamda表达式相关

java程序new对象后加大括号{},匿名类,闭包,lamda表达式相关

时间:2023-04-23 17:33:09浏览次数:45  
标签:闭包 lamda java String 接口 匿名 println new public

 

这种在源码中经常出现,所以我拿出来说一说

步骤 1  new一个匿名子类对象    

我姑且叫这种情况为“匿名子类”吧,就是有这样的情况,你new一个类的时候直接加一对花括号,实际上已经创建了它的一个匿名子类。老实说,我第一次见到这种写法也是懵逼的。

比如我有一个父类

public class Fu {
 
    private String name;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void eat(){
        System.out.println(name + " 吃饭!");
    }
}

这是一个平平无奇的类,假如我们要弄个类继承Fu,然后重写eat方法,一般会这么写:

public class Zi extends Fu{
    @Override
    public void eat() {
        System.out.println("这是Zi类的eat方法!");
    }
}

这样做当然是可以的,但是会有这样的情况,就是我们希望有个类,仅仅重写了eat方法,而且很确定不会在别的地方再使用该子类了,就可以new一个匿名子类对象:

Fu f = new Fu(){
    @Override
    public void eat() {
        System.out.println("eat方法被重写了!");
    }
};

这样就可以省去多写一个类的麻烦。

 步骤 2  匿名子类的构造器    

先看一段代码

public static void main(String[] args) {
    Fu f = new Fu(){
 
        /** 这里再打一个打括号,就是在匿名子类的构造器中写东西 */
        {
            setName("Zi");
        }
 
        @Override
        public void eat() {
            /** this.getClass为匿名类*/
            System.out.println(this.getClass());
            System.out.println(this.getName() + " eating...");
        }
    };
 
    f.eat();
}

这种写法也很奇特,但是真的有用!你可以在生成匿名子类对象的时候,把数据初始化一下。

 

步骤 3  实战应用1.给HashMap赋初值   

Map<String,Object> study = new HashMap<String,Object>(){{
    put("name","java小白翻身");
    put("url","java18.cn");
}};
System.out.println(study);

这下是真的学到了,因为生成的对象还是Map(因为多态),所以不会有任何影响,赶紧拿去秀翻同事吧~~

步骤 4  实战应用2.给ArrayList赋初值  

List<Integer> list = new ArrayList<Integer>(){{
    add(1);
    add(2);
    add(3);
}};
System.out.println(list);

 步骤 5  实战应用3.传参的时候直接new接口    

这种情况是非常普遍的!

这种情况是非常普遍的!

这种情况是非常普遍的!

重要的话说三遍,如果你喜欢翻看源码,这种技巧真的是随处可见。比如:

//直接开启一个线程
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("线程开启!");
    }
}).start();

一般这种情况都是直接new接口,实际上是new一个接口的匿名实现类啦,不过我一般喜欢说new一个接口。

如果这个接口中只有一个抽象方法,就可以用lamda表达式:

new Thread(() -> {
    System.out.println("线程开启!");
}).start();

 

函数式编程(匿名,高阶段函数,闭包,lamda)

从 Java 8 开始便出现了函数式接口(Functional Interface,以下简称FI)

定义为: 如果一个接口只有唯一的一个抽象接口,则称之为函数式接口。为了保证接口符合 FI ,通常会在接口类上添加 @FunctionalInterface 注解。理解了函数式接口可以为 Java 函数式编程打下基础,最终可通过运用函数式编程极大地提高编程效率。

函数式接口 (Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

函数式接口可以对现有的函数友好地支持 lambda。

 

步骤 6  神级展开: 我顺手做了个小框架?!    

这部分内容是我突然想到的,既然这个匿名子类对象这么好用,我是不是可以用这个特性来做个SQL生成器?

最终做出来的效果是这样的:

String sql = new SQL(){{
   select("*").from("t_user").where("uname like 'j%'")
           .and("sex='男'").orderby("id desc");
}}.toString();
System.out.println(sql);

很美观,很有趣是不是,其实SQL类的代码异常简单啦,相信你也一定可以写出来:

package com.javaxbfs.demo;
 
/** 自定义简单SQL构建器,不支持复杂sql* */
public class SQL {
 
    public StringBuffer sql = new StringBuffer();
 
    public SQL select (String targetStr){
        sql.append(" select ").append(targetStr);
        return this;
    }
 
    public SQL from (String table){
        sql.append(" from ").append(table);
        return this;
    }
 
    public SQL where (String where){
        sql.append(" where ").append(where);
        return this;
    }
 
    public SQL and (String and){
        sql.append(" and ").append(and);
        return this;
    }
 
    public SQL orderby (String orderby){
        sql.append(" order by ").append(orderby);
        return this;
    }
 
    public String toString() {
      return sql.toString();
    }
 
}

 

 

 

 

 

转 : https://blog.csdn.net/weixin_39570751/article/details/121253167

http://www.3qphp.com/java/Jgrammar/3108.html

 

标签:闭包,lamda,java,String,接口,匿名,println,new,public
From: https://www.cnblogs.com/fps2tao/p/17347189.html

相关文章

  • java动态生成页面
    1.java中动态生成html具体适用哪些情况除了发布新闻那些的。答:数据量大,且增删改查频繁的。2.购物网站如果访问量不是很大。商品详细页面是否有必要也动态生成HTML?答:明显有必要,因为商品详细要经常修改,一般不改页面,改的是数据3.如果动态生成了HTML......
  • JavaScript的swichcase方法
    functionchangeBody(index){switch(index){case1:{document.getElementById('bull').style.display="";document.getElementById('cont').style.display="none";document.getElementById('gridPager'......
  • JavaScript的类型转换(字符转数字,数字转字符)
    在Java中,基本类型之间的强制转换也不是这样的,比如,整数要转换成字符串,必须使用Integer.toString()静态方法或者String.valueOf()静态方法,把字符串转换为整数,必须使用Integer.valueOf()。可见,不能把JavaScript中的类型转换看作为“强制类型转换”。在JavaSc......
  • Vue 项目安全扫描漏洞,JS 库版本太低,要求升级 YUI(vue2 升级javascript库)【检测到目标站
    原帖:https://blog.csdn.net/u012961419/article/details/130016341背景公司信安部门对项目进行安全扫描,查出一些漏洞,其中有一项要求升级javascript框架库(如图): 吓得我以为让我把Vue2升级成Vue3。经过一番询问后才知道,是工具包中依赖的YUI是存在安全漏洞的版本。漏洞定......
  • Java__SpringBoot与Vue连接
    SpringBoot与Vue注解RequestMapping("/dir/")创建一个方便前端调用的接口目录/接口函数,前端可以获取到函数返回的数据@RestController@RequestMapping("/dir/")publicclassBotInfoController{@RequestMapping("getinfo/")publicMap<String,String>GetI......
  • Java MD5与RSA加密使用
    JavaMD5与RSA加密使用转发数据到广州,那边要求HTTP请求的头部需要用MD5签名,请求体数据需要使用RSA加密,研究了一下。MD5MD5(MessageDigestAlgorithm5)是一种广泛使用的加密哈希函数,可将任意长度的消息转换为128位的哈希值(通常以32个十六进制字符表示)。MD5算法是一种单......
  • Java Assert断言使用
    目录断言所谓的assertion,是jdk1.4后加入的新功能。作用它主要使用在代码开发和测试时期,用于对某些关键数据的判断,如果这个关键数据不是你程序所预期的数据,程序就提出警告或退出。后续当软件正式发布后,可以取消断言部分的代码。java中使用assert作为断言的一个关键......
  • javamock生成对象
    `importjava.lang.reflect.Field;importjava.lang.reflect.ParameterizedType;importjava.util.ArrayList;importjava.util.Date;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Random;publicclassMock{privatesta......
  • JavaScript实现文件上传下载功能实例解析
    ​ 需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。 第一步:前端修改由于项目使用的是BJUI前端框架,并没有使用框架本身的文件上传控件,而使用的基于jQuery的Uploadify......
  • java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check th
    java.sql.SQLSyntaxErrorException:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear''',b_5='17',b_6=''whereb_name='A'......