标签: java-8

为什么 Random::nextInt 在 java 中不允许作为方法引用?

所以我正在阅读泛型和函数式接口。显示了两种方法 - 使用 Lambda,使用方法引用。使用了以下示例:

Predicate<String> ref = String::isEmpty;
Run Code Online (Sandbox Code Playgroud)

Java 使用在运行时提供的参数作为调用 isEmpty 的实例。这是允许的,因为 isEmpty() 是 String 类中的一个实例方法并且不带任何参数。

我的问题是,当我使用以下代码行时,为什么会显示编译错误:

Supplier<Integer> ref2 = Random::nextInt;
Run Code Online (Sandbox Code Playgroud)

毕竟 nextInt() 是 Random 类中的实例方法,就像 String 类中的 isEmpty() 一样,它也不带参数。

java java-8

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

更新 Fuse 以使用 TLS v1.3

我是 JBoss Fuse 服务器的新手。我们使用的 Fuse 服务器版本是 7.2。根据位置undertow.xml文件${karaf.home}/etc,我们目前支持TLSv1,TLSv1.1TLSv1.2. 要求是添加更高版本(TLSv1.3在这种情况下)。我想检查先决条件和可行性方面。

另外,我无法确定 Fuse 7.2 是否可以支持TLSv1.3

我们正在使用 Java 8。

任何可以引导我的信息/方向都受到高度赞赏。

java-8 jboss7.x jbossfuse tls1.3

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

使用 Java 8 迭代 Map&lt;String,Object&gt; 数组并返回 Map&lt;Long,Long&gt;

我有一个地图数组。其中我需要做一些计算并返回另一个 Map 并将相同的键计数添加到结果中的值中。我试过下面的一个。但由于它是并行运行的,因此不会添加它。

请帮助改进它

我可以在正常的 for 循环中实现这一点。

public Map<Long,Long> solve(Map<String,Stats>... map){
        Map<Long,Long> resultCount = new HashMap<Long,Long>();
        if(map != null){
       
            resultCount = Arrays.stream(map).filter(Objects::nonNull).map(map -> getUserCountMap(map))
            .collect(HashMap::new, Map::putAll, Map::putAll);
  
    }
        return resultCount;
    }
    
   public Map<Long,Long>  getUserCountMap(Map<String, Stats> map) {
       Map<Long,Long> resultCount = new HashMap<Long,Long>();
       
       map.forEach((k,v)->{
           try {
                
               String key = (String) k;
               Stats userValue = (Stats) v;
               Long userId = new Long(key);
               System.out.println("key :::"+key+":::"+resultCount.getOrDefault(userId, 0l));
               Optional<Long> count = userValue.getCount();
               System.out.println(count.get());
               count.ifPresent(aLong -> resultCount.put(userId, (resultCount.getOrDefault(userId, 0l) + aLong)));
               System.out.println(resultCount);

           } catch (Exception e) …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

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

将 java.util.function.Function 定义为 static final

在我的代码中,我们必须将欧元转换为欧分:将 aBigDecimal作为输入,我们必须将其乘以 100。

我们需要多次应用这种转换,所以我们决定使用UnaryOperatorfrom java.util.function

private static final UnaryOperator<BigDecimal> CONVERT_EURO_TO_CENTS =
        input -> input.multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.DOWN);
Run Code Online (Sandbox Code Playgroud)

然后我们使用CONVERT_EURO_TO_CENTS如下:

[.....]

    CONVERT_EURO_TO_CENT.apply(<aBigDecimal>)

[.....]
Run Code Online (Sandbox Code Playgroud)

将 声明UnaryOperator为常量 ( static final)可能是危险的,以避免多线程环境中的数据不一致(线程安全)?

java static java-8 functional-interface

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

使用 java 供应商接口创建条件对象

我有一个方法如下:

void updateObject(ObjOne obj, SomeClass data) {
    if(obj != null) {
        obj.doSomething(data);
    }
}
Run Code Online (Sandbox Code Playgroud)

updateObject多次调用,避免空检查在每一个地方,我想避免以下的:

// directly invoke doSomething conditionally.
if(obj != null) {
    SomeClass data = getData();
    obj.doSomething(data);
}
Run Code Online (Sandbox Code Playgroud)

由于data仅在obj非空时使用,我想到了如下重构代码:

void updateObject(ObjOne obj, Supplier<SomeClass> data) {
    if(obj != null) {
        obj.doSomething(data.get());
    }
}
Run Code Online (Sandbox Code Playgroud)

这将SomeClass仅在需要时创建一个对象,而是创建一个Supplier类型的对象。

上述方法使用Supplier更好吗?

java performance java-8

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

使用 Java Streams 返回出现单词的句子的计数和列表

我被困在试图找出每个单词出现的句子中。该条目将是一个句子列表

Question, what kind of wine is best? 
White wine.
A question
Run Code Online (Sandbox Code Playgroud)

输出将是

// format would be: word:{count: sentence1, sentence2,...}
a:{1:3} 
wine:{2:1,2} 
best:{1:1} 
is:{1:1} 
kind:{1:1} 
of:{1:1} 
question:{2:1,3} 
what:{1:1}
white:{1:2}
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所得到的:

static void getFrequency(List<String> inputLines) {
  List<String> list = inputLines.stream()
     .map(w -> w.split("[^a-zA-Z0-9]+"))
     .flatMap(Arrays::stream)
     .map(String::toLowerCase)
     .collect(Collectors.toList());

   Map<String, Integer> wordCounter = list.stream()
     .collect(Collectors.toMap(w -> w, w -> 1, Integer::sum));
}
Run Code Online (Sandbox Code Playgroud)

有了这个,我只能得到每个单词出现在所有句子中的次数,但我还需要获得该单词出现的句子列表。看起来也许是为了获取我可以使用的句子的 id IntStream.range,如下所示:

 IntStream.range(1, inputLines.size())
          .mapToObj(i -> inputLines.get(i));
Run Code Online (Sandbox Code Playgroud)

但我不确定这是否是最好的方法,我是 Java 新手

java lambda java-8 java-stream

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

将 lambda 表达式用于 Java 中的嵌套 for 循环

我正在学习 java 中的 lambda 表达式。我有使用“for”循环的代码,如下所示:

for (RoutingCode routingCode: referencesDao.getRoutingCodes()) {
  ReferencesUtil.routingCodeToXml(references.addElement("referenceType"), routingCode);

  for (AutoCreateIssue ac: referencesDao.getAutoCreateIssues(routingCode.getId())) {
    ReferencesUtil.autoCreateIssueToXml(references.addElement("referenceType"), ac);
  }
}
Run Code Online (Sandbox Code Playgroud)

我想为上面写一个 lambda 表达式。如果只有一个 for 循环,我可以写出 lambda 表达式,但是当有嵌套的 for 循环时就不能写了。任何帮助表示赞赏。

这是我用一个循环尝试的:

referencesDao.getRoutingCodes().stream().forEach(routingCode -> ReferencesUtil.routingCodeToXml(references.addElement("referenceType"), routingCode));
Run Code Online (Sandbox Code Playgroud)

java java-8

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

是如何决定谓词“和”方法在java中拥有消费者而不是生产者的?

我正在浏览 java 8 中引入的 Predicate 类,它是函数式接口。Predicate 类中有一个方法和方法,用于将多个谓词组合成一个。

default Predicate<T> and(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) && other.test(t);
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了 Java 中 PECS 的概念,但仍然无法理解为什么在 Predicate 的情况下我们使用? super T. Java 程序员如何决定它将成为消费者而不是生产者。

我的意思是为什么不允许出现编译错误的行:

public class PredicateExample {
    public static void main(String[] args) {
        Predicate<Number> pred = n -> n.intValue() > 2;
        Predicate<Integer> predInt = n -> n > 3;
        //Compile error
        //pred.and(predInt);

        Predicate<Object> predObj = o -> Integer.parseInt(o.toString()) > 4;
        pred.and(predObj); //Valid statement

        Number n = new …
Run Code Online (Sandbox Code Playgroud)

java lambda functional-programming java-8 pecs

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

你如何以 yyyy-MM-dd 格式设置日期,然后能够在 Java 1.8 中以相同的格式打印出来?

在以下代码中:

    ZonedDateTime zdt = ZonedDateTime.now();
    DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    String zdtString = FORMATTER.format(zdt);
    System.out.println(zdtString);
Run Code Online (Sandbox Code Playgroud)

您将看到它以 yyyy-DD-mm 格式打印出当前日期。由于这个问题是在 2021 年 7 月 17 日发布的,所以它打印了:

2021-07-17
Run Code Online (Sandbox Code Playgroud)

但是现在我想将日期更改为不同的日期(例如 1994-03-24)。

所以我试过:

    DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    ZonedDateTime zdt2 = ZonedDateTime.parse("1994-03-24", FORMATTER);
    String zdtString = FORMATTER.format(zdt2);
    System.out.println(zdtString);
Run Code Online (Sandbox Code Playgroud)

但后来我得到以下异常:

Exception in thread "main" java.time.format.DateTimeParseException: Text '1994-03-24' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 1994-03-24 of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
    at javaapplication5.JavaApplication5.main(JavaApplication5.java:48)
Caused by: java.time.DateTimeException: Unable to obtain …
Run Code Online (Sandbox Code Playgroud)

java date java-8

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

Java Streams 将 Streams 与供应商连接起来,然后是不同的(惰性求值行为)

我有一个像这样的简单代码

import java.util.function.Supplier;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class StreamSupplierVersusConcat {
    public static void main(String[] args) {
         final StreamSupplierVersusConcat clazz = new StreamSupplierVersusConcat();
         clazz.doConcat();                
    }

    private void doConcat(){        
         System.out.println(Stream.concat(buildStreamFromRange(0,1000).get()
                ,buildStreamFromRange(1000,2000).get())
                .anyMatch("1"::equals));                
}

    private Supplier<Stream<String>>buildStreamFromRange(final int start,final int end){
        return ()->IntStream.range(start, end)
                .mapToObj(i->{
                    System.out.println("index At: "+i);
                    return String.valueOf(i);
                });
    }    
}
Run Code Online (Sandbox Code Playgroud)

我知道 concat 是懒惰的,所以当我运行代码时,我看到它只生成了 2 个很棒的值,但知道 distinct 是一个有状态的操作,我认为将该方法放在 Stream 管道上它会生成所有值,然后做 anyMatch 方法,但如果我这样说

    private void doConcat(){        
         System.out.println(Stream.concat(buildStreamFromRange(0,1000).get()
                ,buildStreamFromRange(1000,2000).get())
                .distinct()//ARE ALL THE VALUES GENERATED NOT REQUIRED HERE???
                .anyMatch("1"::equals));                
}
Run Code Online (Sandbox Code Playgroud)

但是有了不同的和没有它,我得到了相同的回应。

index At: 0 …
Run Code Online (Sandbox Code Playgroud)

java distinct-values java-8 java-stream

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