标签: java-8

Java 8如何能够推断出lambdas参数类型

我目前正在使用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)

java lambda java-8 vert.x

2
推荐指数
1
解决办法
655
查看次数

MapStruct将新的计算字段添加到dto

我正在尝试将实体映射OrderOrderDTO使用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会启动错误

未映射的目标属性:"总计".

知道如何解决这个问题吗?

谢谢

java-8 spring-boot mapstruct

2
推荐指数
1
解决办法
1234
查看次数

在对象数组中搜索某些String

我找不到答案所以我必须发布一个新问题 - 虽然它似乎与已经在这里提出的其他几个问题相似 - 但重点是:

我有一些列表,例如:

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,我是新手.有人能告诉我一个很好的方法吗?

java arraylist java-8 java-stream

2
推荐指数
1
解决办法
98
查看次数

根据对象的参数化属性对对象列表进行排序

假设我们有一个具有以下属性的对象:

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方法

java-8

2
推荐指数
1
解决办法
118
查看次数

Java 8 Stream/Collectors映射键与Collectors.counting()

我想得到频率键控的数组值频率图.我能够相反 - 按价值键入地图.尝试切换参数,但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,并将值作为数组元素列表.对于键冲突,请将另一个值添加到值列表中.

java java-8 java-stream

2
推荐指数
1
解决办法
1509
查看次数

在检查null时,从对象列表中创建唯一的值列表

比如,有一个班,员工

@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子句?

java lambda java-8 java-stream

2
推荐指数
1
解决办法
66
查看次数

使用流收集器从java对象获取键值

我正在尝试使用流和集合从对象列表中获取键和值列表,但我不知道是否可能.

我有这门课:

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)

java java-8 java-stream collectors

2
推荐指数
1
解决办法
1376
查看次数

我们可以像对Optionals一样采用布尔值到Java8(ifPresent和orElse)

使用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 optional java-8

2
推荐指数
2
解决办法
1939
查看次数

如何动态地将谓词添加到列表中

有没有办法在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)

java predicate list java-8

2
推荐指数
1
解决办法
780
查看次数

是否有更好的(java8?)方式来收集异常的"原因堆栈"?

我们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 exception java-8

2
推荐指数
1
解决办法
220
查看次数