假设我在Java 8中有以下功能接口:
interface Action<T, U> {
U execute(T t);
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,我需要一个没有参数或返回类型的操作.所以我写这样的东西:
Action<Void, Void> a = () -> { System.out.println("Do nothing!"); };
Run Code Online (Sandbox Code Playgroud)
但是,它给了我编译错误,我需要把它写成
Action<Void, Void> a = (Void v) -> { System.out.println("Do nothing!"); return null;};
Run Code Online (Sandbox Code Playgroud)
这很难看.有没有办法摆脱Void类型参数?
我已经将Java应用程序更新为Java 8.应用程序严重依赖于HashMaps.当我运行基准时,我看到了不可预测的行为.对于某些输入,应用程序比以前运行得更快,但对于较大的输入,它会一直较慢.
我检查过探查器,最耗时的操作是HashMap.get.我怀疑这些更改是由Java 8中的HashMap修改引起的,但可能不是这样,因为我已经更改了其他一些部分.
有没有一种简单的方法可以将原始的Java 7 HashMap挂钩到我的Java 8应用程序中,这样我只需要更改hashmap实现,看看我是否仍然观察到性能的变化.
以下是一个尝试模拟我的应用程序正在执行的操作的最小程序.基本思想是我需要在应用程序中共享节点.在某个运行时点,如果某个节点已根据某些整数属性而不存在,则应该检索或创建该节点.以下仅使用两个整数,但在实际应用程序中我有一个,两个和三个整数键.
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class Test1 {
static int max_k1 = 500;
static int max_k2 = 500;
static Map<Node, Node> map;
static Random random = new Random();
public static void main(String[] args) {
for (int i = 0; i < 15; i++) {
long start = System.nanoTime();
run();
long end = System.nanoTime();
System.out.println((end - start) / 1000_000);
}
}
private static void run() {
map = new HashMap<>(); …Run Code Online (Sandbox Code Playgroud) 我正在编写一个需要在运行时定义和编译模式的应用程序.使用Java PatternAPI,我需要传递一个字符串并获得一个模式.像这样的东西:
Pattern.compile("ab*|c*");
Run Code Online (Sandbox Code Playgroud)
问题是我的模式是模块化的,我想用替代的,kleene星等组成它们,例如:
Char a = new Char('a');
Char b = new Char('b');
Char c = new Char('c');
Regex r = new Regex(new Alt(new Seq(a, new KleeneStar(b)), new KleeneStar(c)));
Pattern.compile(r);
Run Code Online (Sandbox Code Playgroud)
我没有在JDK中找到一个API来允许我这样的事情.我假设模式的底层实现应该有这样的API.有没有人知道如何从标准Java中获取这样的API,或者是否有第三方库?
最后,我想我可以用一些递归访问者自己创建这样一个API来打印输出字符串,但如果它已经退出就会很好.
我正在研究C#5.0的语法,并不太了解"base"的用法.在参考手册中,有一个"基本访问"的概念定义为:
base-access:
base . identifier
base [ expression-list ]
Run Code Online (Sandbox Code Playgroud)
base关键字在哪里,似乎这是唯一的情况.但是,我遇到了C#等输入
base.WithAdditionalDiagnostics<TNode>(node, diagnostics);
Run Code Online (Sandbox Code Playgroud)
有人能指出我这个陈述所指的语法规则吗?由于'base'似乎是一个普通的关键字,而不是上下文,我假设对于这种情况应该有一个特定的语法规则,并且base不能简单地是一个标识符.
假设我有以下类层次结构:
public interface Result {
}
public class Failure implements Result {
private String msg;
public Failure(String msg) {
this.msg = msg;
}
@Override public String toString() { return msg; }
}
public class Success implements Result {
private int time, count;
public Success(int time, int count) { this.time = time; this.count = count; }
public int getTime() { return time; }
public int getCount() { return count; }
@Override public String toString() { return time + ", " + …Run Code Online (Sandbox Code Playgroud) 返回Character.getType(int codePoint)一个整数,但我找不到从中获取 unicode 类别名称(例如“Lu”或“Cn”)的方法。Character.getCategoryTypeName(int codePoint)我想要的是一个返回表示类型的字符串的方法。
类别名称位于常量注释中,一种方法是为返回的类型编写一个 switch case,然后手动对类型名称进行编码,如下所示:
我原来的计划是这样的:
for (int i = 0; i <= 0x10FFFF; i++) {
switch (Character.getType(i)) {
// General category "Sc" in the Unicode specification.
// public static final byte CURRENCY_SYMBOL = 26;
case Character.CURRENCY_SYMBOL:
map.put(i, "Sc");
break;
....
}
}
Run Code Online (Sandbox Code Playgroud)
但这会非常乏味。是否有自动方法或库来完成任务?
我正在重写一个涉及使用Java 8以1000万的顺序处理对象的应用程序,我注意到流可以使应用程序的速度降低25%.有趣的是,当我的集合也是空的时候会发生这种情况,因此它是流的常量初始化时间.要重现此问题,请考虑以下代码:
long start = System.nanoTime();
for (int i = 0; i < 10_000_000; i++) {
Set<String> set = Collections.emptySet();
set.stream().forEach(s -> System.out.println(s));
}
long end = System.nanoTime();
System.out.println((end - start)/1000_000);
start = System.nanoTime();
for (int i = 0; i < 10_000_000; i++) {
Set<String> set = Collections.emptySet();
for (String s : set) {
System.out.println(s);
}
}
end = System.nanoTime();
System.out.println((end - start)/1000_000);
Run Code Online (Sandbox Code Playgroud)
结果如下:224对5毫秒.
如果我forEach直接使用set,即set.forEach()结果将是:12 vs 5ms.
最后,如果我在外面创建一次封闭
Consumer<? super String> consumer = s -> System.out.println(s); …Run Code Online (Sandbox Code Playgroud) 考虑以下JavaScript代码(在节点REPL中):
> let a = new Array(10)
undefined
> a
[ <10 empty items> ]
> a.map(e => 1)
[ <10 empty items> ]
> let b = new Array(10).fill(undefined)
undefined
> b
[ undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined ]
> b.map(e => 1)
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
>
Run Code Online (Sandbox Code Playgroud)
当我创建一个空数组时,我会得到"空项",它们的行为似乎与之不同undefined.有人能解释一下有什么区别吗?
有人可以向我解释以下代码中成员访问中的问号是什么意思?
它是标准C#的一部分吗?尝试在Xamarin Studio中编译此文件时出现解析错误.
this.AnalyzerLoadFailed?.Invoke(this, new AnalyzerLoadFailureEventArgs(AnalyzerLoadFailureEventArgs.FailureErrorCode.NoAnalyzers, null, null));
Run Code Online (Sandbox Code Playgroud)
我有Haskell的基本知识(请原谅我,如果我的问题对于Haskellers来说看起来微不足道),并且最近一直在研究Haskell的语法.在Haskell 2010报告中,只有一个地方使用关键字"type":
topdecl ::= "type" simpletype "=" type
Run Code Online (Sandbox Code Playgroud)
可以看出,总有一个"="是必需的.在一个Haskell文件中,我看到了这段代码:
type Key m :: *
Run Code Online (Sandbox Code Playgroud)
取自TrieMap.hs第61行.
这不符合规则.我怀疑这是一个GHC扩展或类似的东西.有人能指出这段代码符合哪种语法规则吗?顺便说一句,我没有找到扩展的语法规则,不得不猜测其中的许多,是否在某处记录?
java ×6
c# ×2
java-8 ×2
lambda ×2
arrays ×1
character ×1
grammar ×1
hashmap ×1
haskell ×1
inheritance ×1
instanceof ×1
java-stream ×1
javascript ×1
null ×1
operators ×1
performance ×1
regex ×1
syntax ×1
undefined ×1
unicode ×1
void ×1