我需要从字符串中解析持续时间.Java 8提供了一种以ISO-8601标准为基础的方法:
Duration.parse("p10d"); // parses as ten days
Duration.parse("pt1h"); // parses as one hour
Run Code Online (Sandbox Code Playgroud)
由于标准规定"允许通过共同协议省略'T'字符",持续时间的一些Javadoc示例中的一些例子都没有T.据他们说,以下表达式应解析为"-6小时+3分钟":
"P-6H3M"
Run Code Online (Sandbox Code Playgroud)
但是我发现所有的表达都省略了T抛出a DateTimeParseException.这是方法中的错误parse()还是我遗漏了什么?
我不明白为什么Map.compute(),并Map.computeIfPresent()采取BiFunction参数以及Map.computeIfAbsent()一个Function:
V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
我期待一个普通的Function<? super V, ? extends V>,将旧值映射到一个新值,resp.a Supplier<? extends V>为新值.调用者已经拥有密钥(第一个参数),因此函数或供应商已经可以使用它.我找到的所有例子都不使用密钥.我想到的原因:
final- 这很容易管理但我不相信这些是这种设计的可行原因.你有什么想法?
我正在开发一种监控计算机的服务.可以通过Web GUI添加或删除计算机.我将报告的数据基本保存在各种地图中Map<Computer, Temperature>.现在收集的数据增长并且数据结构变得更加复杂(包括相互引用的计算机),我需要一个概念,说明从监控中删除计算机时会发生什么.基本上我需要删除被删除的计算机报告的所有数据.最像KISS的方法是从内存中手动删除数据,比如
public void onRemove(Computer computer) {
temperatures.remove(computer);
// ...
}
Run Code Online (Sandbox Code Playgroud)
每当我添加功能时都必须更改此方法:-(我知道Java有WeakHashMap,所以我可以存储报告的数据,如下所示:
Map<Computer, Temperature> temperatures = new WeakHashMap<>();
Run Code Online (Sandbox Code Playgroud)
System.gc()每当计算机从监控中移除时我都可以打电话,以便从这些地图中急切地删除所有相关数据.
虽然第一种方法看起来有点像原始的MyISAM表,但第二种方法类似于InnoDB表中的DELETE级联.但它仍然感觉有点不舒服,可能是错误的方法.你能否指出WeakHashMaps这个问题的优缺点或提出其他解决方案?
ScheduledExecutorService从ExecutorService,shutdown()和shutdownNow()继承两个方法.他们之间的区别:
shutdown启动有序关闭,其中先前提交的任务被执行,但不会接受任何新任务.如果已经关闭,调用没有其他影响.
shutdownNow尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表.
现在我想暂停等待任务的处理,而我不想中断当前正在执行的任务.我不能打断线程,因为涉及第三方库并且它们不能很好地处理中断:-(但是我需要取消当前没有执行的计划任务,因为大多数都是在一小时左右的时间内安排的.
处理这个问题的最佳方法是什么?我有什么选择?
为了减少内存消耗,我正在重写一个有类的内存SortedSet<Integer>.在80%的情况下,此集合仅包含单个元素.所以我认为我可以SingeltonSet在这些情况下使用a 而TreeSet在其他情况下使用正常情况.现在我注意到SingletonSet,如所返回的那样Collections.singleton(),没有实现SortedSet.这个缺点有什么理由吗?我会说,单个元素总是可以被认为是排序的.我必须编写自己的SingletonSet实现吗?
我在当前版本的Java 8中发现了一个奇怪的行为.在我看来,下面的代码应该没问题,但JVM会抛出NullPointerException:
Supplier<Object> s = () -> false ? false : false ? false : null;
s.get(); // expected: null, actual: NullPointerException
Run Code Online (Sandbox Code Playgroud)
没关系,它是什么样的lambda表达式(与之相同java.util.function.Function)或使用什么泛型类型.也可以用更有意义的表达来代替false ? :.上面的例子非常简短.这是一个更加丰富多彩的例子:
Function<String, Boolean> f = s -> s.equals("0") ? false : s.equals("1") ? true : null;
f.apply("0"); // false
f.apply("1"); // true
f.apply("2"); // expected: null, actual: NullPointerException
Run Code Online (Sandbox Code Playgroud)
但是这些代码块运行良好:
Supplier<Object> s = () -> null;
s.get(); // null
Run Code Online (Sandbox Code Playgroud)
和
Supplier<Object> s = () -> false ? false : null;
s.get(); …Run Code Online (Sandbox Code Playgroud) 在RestFul-Webservice(Jersey)上下文中,我需要将Object图形编组/序列化为XML和JSON.为简单起见,我尝试用2-3个类来解释这个问题:
Person.java
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
private String name;
// @XmlIDREF
@XmlElement(name = "house")
@XmlElementWrapper(name = "houses")
private Collection<House> houses;
public Person() {}
public Person(String name, Collection<House> houses) {
this.name = name;
this.houses = houses;
}
}
Run Code Online (Sandbox Code Playgroud)
House.java
@XmlAccessorType(XmlAccessType.FIELD)
public class House {
// @XmlID
public String name;
public String location;
public House() {}
public House(String name, String location) {
this.name = name;
this.location = location;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我序列化Person时,XML将如下所示:
<people>
<person>
<name>Edward</name>
<houses>
<house>
<name>MyAppartment</name>
<location>London</location>
</house>
<house> …Run Code Online (Sandbox Code Playgroud) 如何通过位置从Stream中提取两个元素?例如,我试图从a中提取元素0和1(这些数字是任意的!)Stream<String>.一个天真的方法是:
List<String> strings = Arrays.asList("s0", "s1", "s2", "s3", "s4");
Consumer<String> c0 = s -> System.out.println("c0.accept(" + s + ")");
Consumer<String> c1 = s -> System.out.println("c1.accept(" + s + ")");
strings.stream().skip(0).peek(c0).skip(1).peek(c1).findAny();
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:
c0.accept(s0)
c0.accept(s1)
c1.accept(s1)
Run Code Online (Sandbox Code Playgroud)
我明白这是因为s0它将进入流,遇到skip(0),然后peek(c0)(它给出第一行)然后skip(1),它将跳过这个元素,然后显然继续从流的开头的下一个元素.
我以为我可以使用这些消费者来提取字符串,但c0会被第二个元素覆盖:
String[] extracted = new String[2];
c0 = s -> extracted[0];
c1 = s -> extracted[1];
Run Code Online (Sandbox Code Playgroud)
编辑:
这些是流的特征:
我正在尝试使用PDO预处理语句编写关键字搜索.理想情况下,我想利用LIKE运算符来搜索字段值中的子字符串.这是我的代码:
$statement = $this->db->prepare("select * from whatever where title like ? or author like ?");
$statement->execute(array("%$titleKeyword%","%$authorKeyword%"));
$rows = $statement->fetchAll(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我尝试这个时,$ rows总是空的.但是,如果我将SQL复制到phpMyAdmin中,并将'%keyword%'替换为每个?符号,它工作正常(我使用关键字时得到结果).
我也尝试了以下代码:
$statement = $this->db->prepare("select * from whatever where title like :titleKeyword or author like :authorKeyword");
$statement->bindValue(":titleKeyword", '%'.$titleKeyword.'%', PDO::PARAM_STR);
$statement->bindValue(":authorKeyword", '%'.$authorKeyword.'%', PDO::PARAM_STR);
$statement->execute();
$rows = $statement->fetchAll(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
我在另一个问题中读过,你应该在绑定参数时包含%,而不是在SQL本身(预先准备好的语句)中,但这不起作用.
我可以直接将关键字插入到SQL中(在进行一些清理之后),但我想坚持使用预准备语句.任何帮助将不胜感激.
我正在尝试使用 AtomicInteger 变量作为锁。因此,想知道下面发布的代码是否是线程安全的。我知道incrementAndGet()是一个原子操作。但是,我不确定后续的 '==' 操作是否也将是原子的(如果在我进行比较时该值增加到 2,该怎么办。)。所以发布这个问题来听听你的想法。
private AtomicInteger count = new AtomicInteger(0); //Shared variable
private final int max = 1;
if(count.incrementAndGet() == max) {
//Do something
}
Run Code Online (Sandbox Code Playgroud) 如果可能的话,如何将// TODO自动生成的方法存根更改为Eclipse中的其他内容?
当我没有通用枚举的运行时类型时,如何创建一个空的EnumSet?示例代码:
public class Utility<T extends Enum<T>> {
private T[] enumConstants;
public Utility(Class<T> e) {
enumConstants = e.getEnumConstants();
}
private EnumSet<T> emptyEnumSet() {
// ?
}
}
Run Code Online (Sandbox Code Playgroud)
这是我目前的解决方法,我认为它有点笨拙:
private EnumSet<T> emptyEnumSet() {
T first = enumConstants[0];
EnumSet<T> result = EnumSet.of(first);
result.remove(first);
return result;
}
Run Code Online (Sandbox Code Playgroud) 下面你看到了我的真实代码,我想它可以简化为
$ echo 123456789012 | awk '{print $1}'
123456789012
Run Code Online (Sandbox Code Playgroud)
问题
我怎样才能awk添加冒号,它会输出12:34:56:78:90:12?
grep -v '^#' $hosts | grep -E '[0-9A-F]{12}\b' | grep -v 000000000000 | awk '{
print "host "$5" {"
print " option host-name \""$5"\";"
print " hardware ethernet "$3";"
print " fixed-address "$1";"
print "}"
print ""
}' > /etc/dhcp/reservations.conf
Run Code Online (Sandbox Code Playgroud)