JAVA函数式编程
程序员文章站
2022-06-07 12:22:55
...
java8中函数终于能赋给变量了。。。。。
废话不多说,直接来看一个函数式编程的demo
这个demo可能不合理,但也是一种编程思想。
大概介绍一下:在一个路由中调用不同的方法。
直接上代码:
基本的User类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String name;
}
基本的Service层:
@Service
public class UserService {
public User insert(User user){
System.out.println("insert");
return new User();
}
public User update(User user){
System.out.println("update");
return new User();
}
public User delete(User user){
System.out.println("delete");
return new User();
}
}
重点在controller层,在参数中传入方法,从而让同一个路由调用不同的方法(这个枚举可以写在其他地方,我是为了省事哈哈哈哈哈~)。
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public String event(@RequestParam Event event){
User user = new User(1,"王");
event.execute(userService, user);
return "success";
}
public enum Event{
UPDATE(UserService::update),
INSERT(UserService::insert),
DELETE(UserService::delete);
private final BiFunction<UserService, User, User> biFunction;
Event(BiFunction<UserService, User, User> biFunction){
this.biFunction = biFunction;
}
public User execute(UserService userService,User user){
return biFunction.apply(userService,user);
}
}
}
这种在一些特定的场合非常的适用,比如,操作一个文档,有初始化,保存,提交…功能
再来一个把:
在spring中解析通配符:
基本的user类我就不列了。。。
看下面:
替换字符串我就直接用了spring的SpelExpressionParser,为了提高速度,异步执行。
创建线程池:
ThreadLocal<ExpressionParser> local = ThreadLocal.withInitial(SpelExpressionParser::new);
定义一个map:
HashMap<String, Function<Object,String>> maps = new HashMap<>();
初始化它:
maps.put("编号", (obj)->local.get().parseExpression("id").getValue(obj,String.class));
//这个Optional用于非空的校验
maps.put("姓名", (obj)-> Optional.ofNullable(local.get().parseExpression("name").getValue(obj,String.class)).orElse("nothing"));
我们现在构造了一个map,这个map用来获取obj里面的参数。
现在构造一个实体:
User user = new User();
user.setId(1);
user.setName("张三");
构造一个通配符:
String strs = "{{编号}}{{姓名}}";
然后对它进行替换解析:
Set<String> strings = maps.keySet();
for (String s : strings) {
strs = strs.replaceAll("\\{\\{" + s + "}}", maps.getOrDefault(s, obj -> s).apply(user));
}
System.out.println(strs);
全部代码如下:
@Test
public void replace() {
ThreadLocal<ExpressionParser> local = ThreadLocal.withInitial(SpelExpressionParser::new);
HashMap<String, Function<Object,String>> maps = new HashMap<>();
maps.put("编号", (obj)->local.get().parseExpression("id").getValue(obj,String.class));
//这个Optional用于非空的校验
maps.put("姓名", (obj)-> Optional.ofNullable(local.get().parseExpression("name").getValue(obj,String.class)).orElse("nothing"));
User user = new User();
user.setId(1);
user.setName("张三");
String strs = "{{编号}}{{姓名}}";
Set<String> strings = maps.keySet();
for (String s : strings) {
strs = strs.replaceAll("\\{\\{" + s + "}}", maps.getOrDefault(s, obj -> s).apply(user));
}
System.out.println(strs);
}
这里都可以抽成方法,我只是做一次demo,就不麻烦了。。。