今天再看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(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将任意长度的输入数据转换为固定长度的128位(16字节)摘要,通常以32位十六进制数的形式表示。这个算法在信息安全、数据验证、密码存储等多个...
- **Lambda表达式**:Java 8引入了lambda表达式,这是一种简洁的匿名函数写法,使得代码更加简洁易读。Lambda可以作为参数传递,也可以作为返回值。例如:`(String s1, String s2) -> s1.compareTo(s2)`。 - **...
4. **方法引用**:方法引用是另一种新特性,它可以引用已有方法,作为lambda表达式的替代。例如,使用`Arrays.sort(list, Integer::compareTo)`代替`list.sort((a, b) -> a.compareTo(b))`,使得代码更加简洁。 5. ...
1. **Lambda表达式**:Java 8引入了lambda表达式,这是一种简洁的匿名函数写法,用于表示单个抽象方法的接口。它可以简化回调和函数式编程,尤其是在处理集合时,如`stream()`操作。 2. **函数式接口**:为了支持...
- **Lambda表达式**:Java 8引入了lambda表达式,这是一种简洁的匿名函数写法,使得编写和处理函数变得更加方便。Lambda表达式可以作为方法参数,也可以用作返回值。 - **函数接口**:为了支持lambda表达式,Java ...
由于JavaScript没有像Java那样的访问修饰符(如`private`),因此匿名函数成为了实现类似私有方法或封装变量的一种方式。接下来,我们将深入探讨匿名函数的各种写法及其应用场景。 1. **立即执行函数表达式 (IIFE)*...
1. Lambda表达式:Java 8引入了Lambda表达式,这是一种简洁的匿名函数写法,能够简化处理函数式接口的代码。Lambda表达式的语法形式为`(parameters) -> expression`或`(parameters) -> { statements }`,它可以作为...
方法引用是一种特殊的Lambda表达式,它允许你直接引用现有的方法或构造器。方法引用可以简化代码,让我们能够直接使用方法名而不是Lambda表达式来执行特定的操作。 方法引用分为几种类型,包括引用静态方法、实例...
1. **lambda表达式**:Java 8引入了lambda表达式,它是一种简洁的匿名函数写法,允许开发者用更少的代码实现函数式接口。Lambda表达式使得处理集合和事件流变得更加简洁,如`Runnable`和`Function`接口的使用。 2. ...
方法引用是一种基于已有Java方法的Lambda表达式的写法,提高了代码的可读性和简洁性。 ##### 3.1 对象::实例方法 ```java Person person = new Person(); person::sayHello; ``` ##### 3.2 类::静态方法 ```java...
1. **Lambda表达式**:Java 8的最大亮点之一就是引入了Lambda表达式,这是一种简洁的匿名函数写法,使得函数式编程风格在Java中变得可能。Lambda表达式可以作为参数传递,也可以作为返回值,大大简化了对集合的操作...
**Lambda表达式**是一种简洁的方法来定义匿名函数。它可以被用于任何接受函数式接口的地方。Lambda表达式的一个关键限制是它不能直接访问接口的**默认方法**。例如: ```java // 错误示例:无法直接访问Math类中的...
2. **Lambda表达式**:JDK 1.8引入了Lambda表达式,这是一种简洁的匿名函数写法,可以简化处理函数接口实例的代码,尤其是在集合API的流操作中。 3. **函数式接口**:与Lambda表达式关联,Java 1.8引入了函数式接口...
如果 Lambda 体中的功能已经由现有方法提供,则可以直接使用方法引用,它是 Lambda 表达式的另一种形式: - 对象的引用::实例方法名 - 类名::静态方法名 - 类名::实例方法名 - 构造器引用 - 数组引用 **示例:** `...
在JavaScript中,递归是一种强大的编程技术,它允许函数调用自身来解决问题。递归通常用于处理层次结构数据、树形结构或者解决那些可以分解为更小子问题的问题。这里,我们将详细探讨两种常见的递归实现方式:直接...
JAVA是一种广泛应用的编程语言,特别是在Web开发领域,它提供了强大的功能和灵活的开发方式。本文档将总结一些JAVA开发中的经验和技巧,涵盖了JAVA语法、JSP、Oracle数据库等方面的知识点。 一、JAVA语法 1. 在JSP...
1. Lambda表达式:Java 8引入了Lambda表达式,这是一种简洁的匿名函数写法,允许将函数作为一个值传递。Lambda表达式的语法是`(参数列表) -> 表达式或代码块`。例如,`(int x, int y) -> x + y`表示一个接受两个整数...
1. **Lambda表达式**:Java 1.8引入了lambda表达式,这是一种简洁的匿名函数写法,使得处理函数式接口变得更加方便,增强了代码的可读性和可维护性。 2. **函数式接口**:如`Runnable`、`Callable`和新引入的`...