标签: java-8

使用Java 8 IntStream计算阶乘?

我在Java 8和lambda表达式方面相对较新Stream,我可以使用for循环或递归计算阶乘.但有没有办法用来IntStream计算数字的阶乘?即使在整数范围内的阶乘也很好.

IntStream在这里阅读了文档,http://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html,我可以看到很多方法,但不确定我可以用哪一个来计算阶乘.

例如,有rang方法说,

range(int startInclusive,int endExclusive)以1为增量步长,从startInclusive(包括)返回到endExclusive(不包含)的顺序有序IntStream.

所以我可以用它来提供IntStream的数字范围来乘以计算阶乘.

number = 5;
IntStream.range(1, number)
Run Code Online (Sandbox Code Playgroud)

但如何将这些数字相乘得到阶乘?

java java-8

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

如何获取两个Java.time.LocalTime实例之间的小时数

我有一个Java.Time.LocalTimestartTime 实例.完成一项任务后,我想获得当前时间并获得两个差异hours.

    int noOfHours = LocalTime.now() - startTime;
Run Code Online (Sandbox Code Playgroud)

java time java-8 java-time

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

Stream在顺序模式下工作,但在并行模式下工作

目前我正在阅读Java 8 Lambdas:实用功能编程(非常有趣且写得很好的书,没有.).

在第6章之后有一个练习:

代码将列表中的每个数字相乘,并将结果乘以5.这样可以顺序执行,但在并行运行时会出错.

public static int multiplyThrough(List<Integer> linkedListOfNumbers) {
    return linkedListOfNumbers.parallelStream()
                       .reduce(5, (acc, x) -> x * acc);
}
Run Code Online (Sandbox Code Playgroud)

和解决方案:

public static int multiplyThrough(List<Integer> numbers) {
    return 5 * numbers.parallelStream()
                      .reduce(1, (acc, x) -> x * acc);
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么第一种方法在并行模式中是错误的,并且书中没有解释.

请解释.

java parallel-processing lambda java-8 java-stream

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

计算列表列表中的对象属性总和(带流)

我正在使用Java 8,我想使用List.stream()functionnalities 来解决我的问题.

这是我的问题:

这是Score班级(Player班级没关系):

public class Score {

    private Player player;
    private int score;

    public Player getPlayer() {
        return player;
    }

    public void setPlayer(Player player) {
        this.player = player;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的程序开始时,我有一个填充的玩家列表:

List<Player> players; // Populated elsewhere
Run Code Online (Sandbox Code Playgroud)

我的程序然后做它必须做的事情,我得到一个这种类型的变量:

List<List<Score>> scores; // Populated elsewhere
Run Code Online (Sandbox Code Playgroud)

现在我想为每个玩家打印一个格式化的输出,例如:

Player.getName() + " : " + averagedScore;
Run Code Online (Sandbox Code Playgroud)

其中一个值averagedScore的总和除以我的变量中此玩家得分的出现次数.score.getScore()Playerscores …

java list java-8

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

ReadWriteLock vs StampedLock

我一直在使用ReadWriteLock来实现/维护锁定习语.

自JDK8 StampedLock推出以来.由于RWLocks以其缓慢和糟糕的性能而闻名,因此StampedLock看起来像是另一种选择(它们不是可重入的,速度更快).

然而,除了性能之外,我认为StampedLock的维护和使用更加困难和复杂 - 例如线程现在可以自行解锁 - 因此应采取相应的措施.

StampedLock比RWLock有什么好处?

java multithreading java.util.concurrent java-8

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

如何使用java 8 lambda创建内部成员列表?

我有这门课:

Class A
{
    List<B> B
}


Class B {
    List<C> c
}
Run Code Online (Sandbox Code Playgroud)

给出一个A如何使用java lambada来创建所有内部列表的实例c

我试过了:

    List<Alternative> alternatives = e2EResult.completeRoutingResponses.stream().map(item -> {
        return item.alternatives }).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但它不起作用

java lambda list java-8

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

Java8重写(扩展)默认方法

假设我们在接口中有一个默认方法,在实现类时如果我们需要添加一些额外的逻辑,除了我们必须复制整个方法的默认方法之外?是否有可能重用默认方法...就像我们使用抽象类一样

super.method()
// then our stuff...
Run Code Online (Sandbox Code Playgroud)

interface java-8 default-method

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

在java 8中从整数数组减少到两倍

这是我的代码:

// assuming HashMap<String, Integer> hashmap
double sum = hashmap.values().stream()
    .reduce(.0, (i, v) -> i + Math.pow(v,2) + 0.5 );
Run Code Online (Sandbox Code Playgroud)

在这种情况下,reduce应该采用(Integer i)和(double v)并将它们相加并将此reduce作为double返回.

相反,我得到这个错误:

- The method reduce(Integer, BinaryOperator<Integer>) in the type Stream<Integer> is not applicable for the arguments (double, (<no type> i, <no type> v) -> {})

- Type mismatch: cannot convert from double to Integer
Run Code Online (Sandbox Code Playgroud)

降低,

但是,这个修复:

// assuming HashMap<String, Integer> hashmap
double sum = hashmap.values().stream()
    .map((t)->(double)t)
    .reduce(.0, (i, v) -> i + Math.pow(v,2) + 0.5 );
Run Code Online (Sandbox Code Playgroud)

这样做有更优雅的方式吗?

java java-8 java-stream

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

从并发修改异常中恢复

所以我坚持使用线程敌对单例实现,它将Iterator返回给HashSet.我有两个线程 - 有时 - 同时访问此迭代器以加载数据.我称之为luckyThread和unluckyThread. ONE他们(unluckyThread)的抛出一个ConcurrentModificationException的.

问题:可以安全地假设其他线程一切顺利吗?具体来说:luckyThread加载的数据是否没有腐败?(发生这种情况的时间系统很好,除了不幸的线程)不要认为这个问题需要任何代码示例,但我很乐意在需要时提供它们.

更新:(没有深入细节)只要其中一个线程加载一个干净的数据集,系统就可以了.并且不用说我修复了这个问题,但这让我想到从这些异常中恢复,我没有找到任何具体的在线.

java linux multithreading java-8

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

如何在Java 8中将[TypeArguments]与构造函数引用一起使用?

Java语言规范Java 8的第15.13节描述了这种形式的方法参考语法,用于创建构造函数引用:

    ClassType :: [TypeArguments] new
Run Code Online (Sandbox Code Playgroud)

例如:

    String s = "abc";
    UnaryOperator<String> test0 = String::new; // String(String) constructor.
    String s0 = test0.apply(s);
    System.out.println("s0 = " + s0); // Prints "abc".

    char[] chars = {'x','y','z'};
    Function<char[], String> test1 = String::new; // String(char[]) constructor.
    String s1 = test1.apply(chars);
    System.out.println("s1 = " + s1); // Prints "xyz"
Run Code Online (Sandbox Code Playgroud)

一切正常,但似乎绝对任何东西(不包括原语)也可以为[TypeArguments]提供,一切仍然有效:

这是一个愚蠢的例子来证明这一点:

    Function<String, String> test2 = String::<LocalDateTime, Thread[]>new; // Compiles !!!???
    String s2 = test2.apply("123");
    System.out.println("s2 = " + s2); // Prints "123"
Run Code Online (Sandbox Code Playgroud)

提出几个问题: …

java-8 method-reference constructor-reference

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