`
zhangyu84849467
  • 浏览: 15416 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 中Function 的一种写法

 
阅读更多

今天再看zuul2 源代码是看到这种 Lambda 表达式的写法, 记录一下

private static final Map< Class<?>, Function<String, Object> > PARSERS = new HashMap<>();

static {

	PARSERS.put( Boolean.class, Boolean::valueOf );

	PARSERS.put( Boolean.TYPE, Boolean::valueOf );

	PARSERS.put( Byte.class, Byte::valueOf );

	PARSERS.put( Byte.TYPE, Byte::valueOf );

	PARSERS.put( Short.class, Short::valueOf );

	PARSERS.put( Short.TYPE, Short::valueOf );

	PARSERS.put( Integer.class, Integer::valueOf );

	PARSERS.put( Integer.TYPE, Integer::valueOf );

	PARSERS.put( Long.class, Long::valueOf );

	PARSERS.put( Long.TYPE, Long::valueOf );

	PARSERS.put( Float.class, Float::valueOf );

	PARSERS.put( Float.TYPE, Float::valueOf );

	PARSERS.put( Double.class, Double::valueOf );

	PARSERS.put( Double.TYPE, Double::valueOf );

	PARSERS.put( Character.class, s -> s.charAt( 0 ) );

	PARSERS.put( Character.TYPE, s -> s.charAt( 0 ) );

	PARSERS.put( String.class, s -> s );

	PARSERS.put( Duration.class, Duration::parse );

	PARSERS.put( Period.class, Period::parse );

	PARSERS.put( Instant.class, Instant::parse );

	PARSERS.put( ZonedDateTime.class, ZonedDateTime::parse );

	PARSERS.put( ZoneId.class, ZoneId::of );

}

 

举个 例子吧

 

接口

public interface ZuulFilter {
// 只有一个方法, 其他方法要有默认的实现
	String filterName(String name);

	default int filterOrder() {
		return 0;
	}

}
 测试代码
public static void main(String[] args) {

	ZuulFilter filter = (name) -> {

		return name.toLowerCase();

	};

	filter.filterName( "JAY" );

	Map<Class<?>, Function<String, Object>> map = new HashMap<Class<?>, Function<String,Object>>();

	map.put( Boolean.class, Boolean::valueOf );
	map.put( Boolean.TYPE, Boolean::valueOf );

	// 相当于这种函数的写法
	map.put( Byte.class, (t) -> {

		return Byte.valueOf( t );

	} );
		
	map.put( Byte.TYPE, (t) -> {

		return Byte.valueOf(t);

	} );

	System.out.println( map.get( Boolean.class ).apply( "true" ) );
		
	System.out.println( map.get( Byte.class ).apply( "47" ) );

}
 

 复杂一些的Function 的写法

public static <T> T usingSystemProperties( Class<T> cls, String prefix ) {

	return createProxy( cls, k -> System.getProperty( prefix + k ) );

}

 

@SuppressWarnings("unchecked")
public static <T> T createProxy( Class<T> cls, Function<String, String> props ) {

	final Class<?>[] interfaces = new Class<?>[] { cls };

//	java.lang.reflect.InvocationHandler
	return (T) Proxy.newProxyInstance( classLoader(), interfaces, ( proxy, method, args ) -> {

		final String name = method.getName();

		if ( method.isDefault() ) {

			return invokeDefault( proxy, method, args );

		} else if ( "get".equals( method.getName() ) ) {
		
			return props.apply( ( String ) args[ 0 ] );
		
		} else {

			Class<?> rt = method.getReturnType();

			String v = props.apply( name );

			if ( v == null ) {

				throw new NoSuchElementException( "could not find value for config setting: " + name );

			}
	
			return valueOf( rt, v );

		}

	} );

}

 

 

 

分享到:
评论

相关推荐

    MD5加密算法:js,asp,java,jsp,jquery多种版本的md5写法

    MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将任意长度的输入数据转换为固定长度的128位(16字节)摘要,通常以32位十六进制数的形式表示。这个算法在信息安全、数据验证、密码存储等多个...

    Java8 英文文档 API .zip

    - **Lambda表达式**:Java 8引入了lambda表达式,这是一种简洁的匿名函数写法,使得代码更加简洁易读。Lambda可以作为参数传递,也可以作为返回值。例如:`(String s1, String s2) -&gt; s1.compareTo(s2)`。 - **...

    java8 API文档

    4. **方法引用**:方法引用是另一种新特性,它可以引用已有方法,作为lambda表达式的替代。例如,使用`Arrays.sort(list, Integer::compareTo)`代替`list.sort((a, b) -&gt; a.compareTo(b))`,使得代码更加简洁。 5. ...

    JavaNew1-8.rar_Java 8_javanew

    1. **Lambda表达式**:Java 8引入了lambda表达式,这是一种简洁的匿名函数写法,用于表示单个抽象方法的接口。它可以简化回调和函数式编程,尤其是在处理集合时,如`stream()`操作。 2. **函数式接口**:为了支持...

    java8参考手册

    - **Lambda表达式**:Java 8引入了lambda表达式,这是一种简洁的匿名函数写法,使得编写和处理函数变得更加方便。Lambda表达式可以作为方法参数,也可以用作返回值。 - **函数接口**:为了支持lambda表达式,Java ...

    js中匿名函数的N种写法

    由于JavaScript没有像Java那样的访问修饰符(如`private`),因此匿名函数成为了实现类似私有方法或封装变量的一种方式。接下来,我们将深入探讨匿名函数的各种写法及其应用场景。 1. **立即执行函数表达式 (IIFE)*...

    Java 8 源码

    1. Lambda表达式:Java 8引入了Lambda表达式,这是一种简洁的匿名函数写法,能够简化处理函数式接口的代码。Lambda表达式的语法形式为`(parameters) -&gt; expression`或`(parameters) -&gt; { statements }`,它可以作为...

    java8新特性

    方法引用是一种特殊的Lambda表达式,它允许你直接引用现有的方法或构造器。方法引用可以简化代码,让我们能够直接使用方法名而不是Lambda表达式来执行特定的操作。 方法引用分为几种类型,包括引用静态方法、实例...

    java8 编程参考官方教程(第9版) 源代码

    1. **lambda表达式**:Java 8引入了lambda表达式,它是一种简洁的匿名函数写法,允许开发者用更少的代码实现函数式接口。Lambda表达式使得处理集合和事件流变得更加简洁,如`Runnable`和`Function`接口的使用。 2. ...

    java 8 新特性详细讲解(自己整理)

    方法引用是一种基于已有Java方法的Lambda表达式的写法,提高了代码的可读性和简洁性。 ##### 3.1 对象::实例方法 ```java Person person = new Person(); person::sayHello; ``` ##### 3.2 类::静态方法 ```java...

    中文API(Java 8).zip

    1. **Lambda表达式**:Java 8的最大亮点之一就是引入了Lambda表达式,这是一种简洁的匿名函数写法,使得函数式编程风格在Java中变得可能。Lambda表达式可以作为参数传递,也可以作为返回值,大大简化了对集合的操作...

    JAVA8新特性各种用法详解

    **Lambda表达式**是一种简洁的方法来定义匿名函数。它可以被用于任何接受函数式接口的地方。Lambda表达式的一个关键限制是它不能直接访问接口的**默认方法**。例如: ```java // 错误示例:无法直接访问Math类中的...

    windwos java jdk1.8 64位 jdk-8u371-windows-x64

    2. **Lambda表达式**:JDK 1.8引入了Lambda表达式,这是一种简洁的匿名函数写法,可以简化处理函数接口实例的代码,尤其是在集合API的流操作中。 3. **函数式接口**:与Lambda表达式关联,Java 1.8引入了函数式接口...

    Java8新特性教程(含代码).docx

    如果 Lambda 体中的功能已经由现有方法提供,则可以直接使用方法引用,它是 Lambda 表达式的另一种形式: - 对象的引用::实例方法名 - 类名::静态方法名 - 类名::实例方法名 - 构造器引用 - 数组引用 **示例:** `...

    javascript中递归的两种写法

    在JavaScript中,递归是一种强大的编程技术,它允许函数调用自身来解决问题。递归通常用于处理层次结构数据、树形结构或者解决那些可以分解为更小子问题的问题。这里,我们将详细探讨两种常见的递归实现方式:直接...

    JAVA开发经验文档

    JAVA是一种广泛应用的编程语言,特别是在Web开发领域,它提供了强大的功能和灵活的开发方式。本文档将总结一些JAVA开发中的经验和技巧,涵盖了JAVA语法、JSP、Oracle数据库等方面的知识点。 一、JAVA语法 1. 在JSP...

    Java JDK 1.8 Api 中文版

    1. Lambda表达式:Java 8引入了Lambda表达式,这是一种简洁的匿名函数写法,允许将函数作为一个值传递。Lambda表达式的语法是`(参数列表) -&gt; 表达式或代码块`。例如,`(int x, int y) -&gt; x + y`表示一个接受两个整数...

    JAVA_API_1.8帮助文档google翻译

    1. **Lambda表达式**:Java 1.8引入了lambda表达式,这是一种简洁的匿名函数写法,使得处理函数式接口变得更加方便,增强了代码的可读性和可维护性。 2. **函数式接口**:如`Runnable`、`Callable`和新引入的`...

Global site tag (gtag.js) - Google Analytics