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 );

		}

	} );

}

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 导出 Excel 有多种方式,其一种较常见的方式是使用 Apache POI 库来操作 Excel,以下是一个简单的示例代码: ```java // 创建工作簿 Workbook workbook = new XSSFWorkbook(); // 创建工作表 Sheet sheet = workbook.createSheet("Sheet1"); // 创建标题行 Row row = sheet.createRow(0); row.createCell(0).setCellValue("姓名"); row.createCell(1).setCellValue("年龄"); row.createCell(2).setCellValue("性别"); // 填充数据 List<User> userList = userService.getUserList(); for (int i = 0; i < userList.size(); i++) { User user = userList.get(i); Row dataRow = sheet.createRow(i + 1); dataRow.createCell(0).setCellValue(user.getName()); dataRow.createCell(1).setCellValue(user.getAge()); dataRow.createCell(2).setCellValue(user.getGender()); } // 设置响应头 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Content-disposition", "attachment;filename=user_list.xlsx"); // 输出 Excel 文件 workbook.write(response.getOutputStream()); ``` 在前端,你可以使用 AJAX 或者表单提交的方式来触发这个导出操作。以下是一个使用 AJAX 的示例代码: ```javascript function exportExcel() { $.ajax({ url: '/user/export', type: 'GET', success: function(data) { var blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); var filename = 'user_list.xlsx'; if (window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveBlob(blob, filename); } else { var link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download = filename; link.click(); } } }); } ``` 在这个示例,我们使用 AJAX 发送一个 GET 请求到后端的 `/user/export` 接口,后端会返回一个 Excel 文件的字节流。前端通过创建一个 Blob 对象来保存这个字节流,并将其转换为一个可下载的文件。如果浏览器支持 msSaveOrOpenBlob 方法,我们可以直接使用该方法来保存文件,否则我们需要创建一个下载链接并模拟点击该链接来下载文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值