我在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.Time.LocalTimestartTime 实例.完成一项任务后,我想获得当前时间并获得两个差异hours.
int noOfHours = LocalTime.now() - startTime;
Run Code Online (Sandbox Code Playgroud) 目前我正在阅读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 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 …
我一直在使用ReadWriteLock来实现/维护锁定习语.
自JDK8 StampedLock推出以来.由于RWLocks以其缓慢和糟糕的性能而闻名,因此StampedLock看起来像是另一种选择(它们不是可重入的,速度更快).
然而,除了性能之外,我认为StampedLock的维护和使用更加困难和复杂 - 例如线程现在可以自行解锁 - 因此应采取相应的措施.
StampedLock比RWLock有什么好处?
我有这门课:
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)
但它不起作用
假设我们在接口中有一个默认方法,在实现类时如果我们需要添加一些额外的逻辑,除了我们必须复制整个方法的默认方法之外?是否有可能重用默认方法...就像我们使用抽象类一样
super.method()
// then our stuff...
Run Code Online (Sandbox Code Playgroud) 这是我的代码:
// 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)
这样做有更优雅的方式吗?
所以我坚持使用线程敌对单例实现,它将Iterator返回给HashSet.我有两个线程 - 有时 - 同时访问此迭代器以加载数据.我称之为luckyThread和unluckyThread. ONE他们(unluckyThread)的抛出一个ConcurrentModificationException的.
问题:可以安全地假设其他线程一切顺利吗?具体来说:luckyThread加载的数据是否没有腐败?(发生这种情况的时间系统很好,除了不幸的线程)不要认为这个问题需要任何代码示例,但我很乐意在需要时提供它们.
更新:(没有深入细节)只要其中一个线程加载一个干净的数据集,系统就可以了.并且不用说我修复了这个问题,但这让我想到从这些异常中恢复,我没有找到任何具体的在线.
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)
提出几个问题: …