我目前正在使用Java中的Vert.x,并注意到文档中的示例广泛使用lambdas作为回调参数.例如:
NetServer server = vertx.createNetServer();
server.listen(1234, "localhost", res -> {
if (res.succeeded()) {
System.out.println("Server is now listening!");
} else {
System.out.println("Failed to bind!");
}
});
Run Code Online (Sandbox Code Playgroud)
查看listen函数文档显示以下内容:
NetServer listen(int port,
String host,
Handler<AsyncResult<NetServer>> listenHandler)
Run Code Online (Sandbox Code Playgroud)
我的问题是JVM如何有机会推断出通用数据类型Handler<AsyncResult<NetServer>>,例如诸如res?之类的非信息性对象?这对于像鸭子这样的类型的JavaScript这样的语言来说似乎很好,但是对于像Java那样强类型的语言来说,这对我来说并不那么明显.如果我们使用匿名类而不是lambda,那么所有数据类型都将在盘子上.
--EDIT--正如@Zircon已经解释的那样,Vert.x文档中可能更好的例子是遵循声明:
<T> void executeBlocking(Handler<Future<T>> blockingCodeHandler,
Handler<AsyncResult<T>> resultHandler)
Run Code Online (Sandbox Code Playgroud)
以及来自docs的用法示例:
vertx.executeBlocking(future -> {
// Call some blocking API that takes a significant amount of time to return
String result = someAPI.blockingMethod("hello");
future.complete(result);
}, res -> {
System.out.println("The result is: " + res.result()); …Run Code Online (Sandbox Code Playgroud) 我正在尝试将实体映射Order到OrderDTO使用MapStruct.我想添加到OrderDTO一个新字段total,此字段在原始实体中不可用Order,应使用Order(订单条目价格,数量,税金......)中提供的信息进行计算.我创建了一个新的字段total,OrderDTO我试图通过向mapper接口添加一个默认方法来映射它:
public interface OrderMapper {
...
default BigDecimal orderToTotal(Order order){
return logicToCalculateTotal();
}
}
Run Code Online (Sandbox Code Playgroud)
当我午餐时,构建MapStruct会启动错误
未映射的目标属性:"总计".
知道如何解决这个问题吗?
谢谢
我找不到答案所以我必须发布一个新问题 - 虽然它似乎与已经在这里提出的其他几个问题相似 - 但重点是:
我有一些列表,例如:
private static List<Book> books = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
它包含了Book我所拥有的类的对象
private String title;
private String author;
Run Code Online (Sandbox Code Playgroud)
和吸气者和制定者.
现在我有了一个新对象Book(通过参数/ servlet从webform获得),我想检查新书的标题是否已经在列表中books.如果它已在该列表中,则打印一些控制台输出.如果不是,我想将整个新对象添加到列表中.为了做到这一点,我尝试使用常规的foreach循环来比较标题.有时候它有效,有时候没有(有时我的功能是以正确的方式比较两个标题,但有时不是 - 我不知道为什么).我知道有一种更好的方法可以使用Java 8.但是,对于Java 8,我是新手.有人能告诉我一个很好的方法吗?
假设我们有一个具有以下属性的对象:
public class MyObject {
private String attr1;
private Integer attr2;
//...
public String getAttr1() {
return this.attr1;
}
public Integer getAttr2() {
return this.attr2;
}
}
Run Code Online (Sandbox Code Playgroud)
mylist根据其属性对此对象的列表进行排序的一种方法attr1是:
mylist.sort(Comparator.comparing(MyObject::getAttr1));
Run Code Online (Sandbox Code Playgroud)
是否可以以动态方式在方法中使用此代码,并使用getAttr1根据其名称返回对象属性的getter的方法替换该部分?就像是:
public void sortListByAttr(List<MyObject> list, String attr) {
list.sort(Comparator.comparing(MyObject::getGetterByAttr(attr)));
}
Run Code Online (Sandbox Code Playgroud)
该MyObject::getGetterByAttr(attr)部分不编译,我写的只是作为一个例子来解释我的想法
我尝试使用以下代码实现一个方法new PropertyDescriptor(attr, MyObject.class).getReadMethod().invoke(new MyObject())但是仍然无法使用该方法中的参数调用comparing方法
我想得到频率键控的数组值频率图.我能够相反 - 按价值键入地图.尝试切换参数,但grouping by不接受Collector作为第一个参数.
另一个问题,我如何更改Map实现以LinkedHashMap保持数组元素的排序(如果地图由值键入)?
int [] arr = {1, 4, 5, 9, 2, 4, 3, 1, 1, 3, 5, 3, 2, 4, 2, 9, 2, 1};
Map<Integer, Long> collect = Arrays
.stream(arr)
.boxed()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)
结果是 {1=4, 2=4, 3=3, 4=3, 5=2, 9=2}
我正在寻找的是
{4=1, 3=[4, 3] , 2=[5, 9] ... }这意味着有4次出现1次,3次出现4次,2次出现5次和9次.
我的目标是使用频率作为键获取Map,并将值作为数组元素列表.对于键冲突,请将另一个值添加到值列表中.
比如,有一个班,员工
@Getter
Class Employee {
empId;
empName;
empDept;
}
Run Code Online (Sandbox Code Playgroud)
我试图从String部门的员工列表中获取逗号分隔的独特部门列表(例如:'销售','技术','运营','培训')
List<Employee> employees = getListOfEmployees();
String departments = getUniqueDepartments(employees);
Run Code Online (Sandbox Code Playgroud)
这就是我想要的:
String getUniqueDepartments(final List<Employee> employees) {
return employees.stream().filter(emp -> emp.getEmpDept()!=null)
.map(emp -> String.format("'%s'", emp.getEmpDept()))
.collect(Collectors.joining(","))
}
Run Code Online (Sandbox Code Playgroud)
如何在此基础上添加distinct子句?
我正在尝试使用流和集合从对象列表中获取键和值列表,但我不知道是否可能.
我有这门课:
public class MyObject {
private int key1;
private String key2;
private String key3;
public int getKey1() { return key1; }
public void setKey1(int key1) { this.key1 = key1; }
public String getKey2() { return key2; }
public void setKey2(String key2) { this.key2 = key2; }
public String getKey3() { return key3; }
public void setKey3(String key3) { this.key3 = key3; }
}
Run Code Online (Sandbox Code Playgroud)
我想处理这个对象的列表,并用逗号分隔所有值和所有键.
List<MyObject> objectList = myObjectList;
String keys = objectList.stream().collect(Collectors.joining(", ","(", ")"));
String values = Collections.nCopies(objectList.size(), "?").stream().collect(Collectors.joining(", …Run Code Online (Sandbox Code Playgroud) 使用Java8,可以这样做:
Optional.ofNullable(realResult).orElse(mockResult);
Run Code Online (Sandbox Code Playgroud)
代替:
if(realResult == null)
return mockResult;
return realResult;
Run Code Online (Sandbox Code Playgroud)
问题:我们可以选择布尔到java8吗?换句话说,我们可以这样写:
Boolean.valueOf(boolVar).ifTrue(trueResult).orElse(falseResult);
Run Code Online (Sandbox Code Playgroud)
代替:
if(boolVar)
return trueResult;
return falseResult;
Run Code Online (Sandbox Code Playgroud)
编辑#1 感谢您建议三元运营,仍然想知道我们是否可以?
有没有办法在Java中动态地将Predicate添加到List中?为了简单说明,我这样做了:
List<Predicate<String>> filters = Arrays.asList(
t -> !Utilities.isNumeric(t)
);
filters.add(t -> !t.isEmpty());
Run Code Online (Sandbox Code Playgroud)
但是filters.add在UnsupportedOperationException中执行结果.像这样的固定列表很好.
List<Predicate<String>> filters = Arrays.asList(
t -> !Utilities.isNumeric(t),
t -> !t.isEmpty()
);
Run Code Online (Sandbox Code Playgroud) 我们BaseException extends Exception的项目中有一个,基本上所有其他异常都来自这个类.我想在运行时更改一些处理"原因堆栈"的方法.
作为起点,我写了以下方法:
class BaseException extends Exception {
...
/**
* Helper: creates a list containing the complete "cause stack" of this exception.
* Please note: the exception on which this method is called is part of result!
*
* @return a {@link List} of all "causes" of this exception
*/
List<Throwable> getAllCauses() {
Throwable cause = this;
List<Throwable> causes = new ArrayList<>();
while (cause != null) {
causes.add(cause);
cause = cause.getCause();
}
return causes;
}
Run Code Online (Sandbox Code Playgroud)
这可以完成工作,虽然它并不完美(名称不是很好,并且也违反了单层抽象). …
java-8 ×10
java ×8
java-stream ×4
lambda ×2
arraylist ×1
collectors ×1
exception ×1
list ×1
mapstruct ×1
optional ×1
predicate ×1
spring-boot ×1
vert.x ×1