小编ste*_*fen的帖子

java.time.Duration中的错误

我需要从字符串中解析持续时间.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()还是我遗漏了什么?

java java-8 java-time

17
推荐指数
2
解决办法
1720
查看次数

为什么Map.compute()采用BiFunction

我不明白为什么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- 这很容易管理
  • 有一些花哨的易用方法参考

但我不相信这些是这种设计的可行原因.你有什么想法?

java dictionary hashmap java-8

10
推荐指数
1
解决办法
1147
查看次数

使用WeakHashMaps模拟DELETE级联

我正在开发一种监控计算机的服务.可以通过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这个问题的优缺点或提出其他解决方案?

java dictionary

9
推荐指数
1
解决办法
201
查看次数

shutdown()和shutdownNow()的混合

ScheduledExecutorServiceExecutorService,shutdown()shutdownNow()继承两个方法.他们之间的区别:

shutdown启动有序关闭,其中先前提交的任务被执行,但不会接受任何新任务.如果已经关闭,调用没有其他影响.

shutdownNow 尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表.

现在我想暂停等待任务的处理,而我不想中断当前正在执行的任务.我不能打断线程,因为涉及第三方库并且它们不能很好地处理中断:-(但是我需要取消当前没有执行的计划任务,因为大多数都是在一小时左右的时间内安排的.

处理这个问题的最佳方法是什么?我有什么选择?

java java.util.concurrent

9
推荐指数
1
解决办法
302
查看次数

为什么SingletonSet不实现SortedSet

为了减少内存消耗,我正在重写一个有类的内存SortedSet<Integer>.在80%的情况下,此集合仅包含单个元素.所以我认为我可以SingeltonSet在这些情况下使用a 而TreeSet在其他情况下使用正常情况.现在我注意到SingletonSet,如所返回的那样Collections.singleton(),没有实现SortedSet.这个缺点有什么理由吗?我会说,单个元素总是可以被认为是排序的.我必须编写自己的SingletonSet实现吗?

java collections

8
推荐指数
2
解决办法
584
查看次数

NullPointerException而不是null(JVM Bug?)

我在当前版本的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)

java lambda jvm ternary-operator

7
推荐指数
1
解决办法
477
查看次数

JAXB使用ID引用而不是包含来序列化XML

在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)

java jaxb jersey xml-serialization

6
推荐指数
1
解决办法
685
查看次数

从流中收集某些元素

如何通过位置从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)

编辑:

这些是流的特征:

  • 只有一个流,而不是列表或数组
  • 流可能是无限的
  • 流可以按顺序进行

java java-8 java-stream

6
推荐指数
1
解决办法
469
查看次数

使用带有%的LIKE运算符进行关键字搜索和PDO预处理语句

我正在尝试使用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中(在进行一些清理之后),但我想坚持使用预准备语句.任何帮助将不胜感激.

php mysql pdo prepared-statement sql-like

5
推荐指数
1
解决办法
2392
查看次数

AtomicInteger 和比较操作

我正在尝试使用 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)

java multithreading atomicinteger

5
推荐指数
1
解决办法
3819
查看次数

如何在Eclipse中将'// TODO自动生成的方法存根'更改为其他内容?

如果可能的话,如何将// TODO自动生成的方法存根更改为Eclipse中的其他内容?

java eclipse

3
推荐指数
1
解决办法
4007
查看次数

创建一个通用类型的枚举集

当我没有通用枚举的运行时类型时,如何创建一个空的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)

java generics enums

3
推荐指数
1
解决办法
493
查看次数

使用 awk 将冒号添加到 MAC 地址?

下面你看到了我的真实代码,我想它可以简化为

$ 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)

regex linux bash awk

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