小编Eri*_*lja的帖子

在while循环内修改的变量不会被记住

在下面的程序中,如果我$foo在第一个if语句中将变量设置为值1 ,那么它的作用就是在if语句之后记住它的值.但是,当我将同一个变量设置ifwhile语句内部的值2时,它在while循环之后就被遗忘了.它的行为就像我$foowhile循环中使用某种变量的副本而我只修改那个特定的副本.这是一个完整的测试程序:

#!/bin/bash

set -e
set -u 
foo=0
bar="hello"  
if [[ "$bar" == "hello" ]]
then
    foo=1
    echo "Setting \$foo to 1: $foo"
fi

echo "Variable \$foo after if statement: $foo"   
lines="first line\nsecond line\nthird line" 
echo -e $lines | while read line
do
    if [[ "$line" == "second line" ]]
    then
    foo=2
    echo "Variable \$foo updated to $foo inside if inside while loop"
    fi
    echo "Value …
Run Code Online (Sandbox Code Playgroud)

bash scope sh while-loop

168
推荐指数
3
解决办法
15万
查看次数

grep和perl正则表达式之间的区别?

我有一个问题,我认为grep的正则表达式和perl的正则表达式有所不同.考虑以下小测试:

$ cat testfile.txt 
A line of text
SOME_RULE = $(BIN)
Another line of text

$ grep "SOME_RULE\s*=\s*\$(BIN)" testfile.txt 
SOME_RULE = $(BIN)

$ perl -p -e "s/SOME_RULE\s*=\s*\$(BIN)/Hello/g" testfile.txt
A line of text
SOME_RULE = $(BIN)
Another line of text
Run Code Online (Sandbox Code Playgroud)

如您所见,使用正则表达式"SOME_RULE\s*=\s*\$(BIN)",grep可以找到匹配项,但perl无法使用相同的表达式更新文件.我该如何解决这个问题?

感谢您提前阅读并感谢您的帮助,感激不尽!

regex perl grep

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

断言列表恰好包含一个满足条件的元素

在我的 JUnit 测试中,我想断言列表中恰好包含一个满足给定条件的元素(列表中可以有很多元素,但只有一个元素应该满足条件)。我写了下面的代码,但我想知道是否可以去掉“new Condition<>”部分并使用“纯”lambda?或者还有其他更优雅的方法来完成我想做的事情吗?

class Foo {
  String u;

  Foo(String u) { this.u = u; }

  String getIt() { return u; }
}

@Test
public void testIt() {
  List<Foo> list = Lists.newArrayList(new Foo("abc"), new Foo("xyz"));

  assertThat(list)
        .haveExactly(1, new Condition<>(
                x -> "xyz".equals(x.getIt()),
                "Fail"));
}
Run Code Online (Sandbox Code Playgroud)

java junit junit4 java-8 assertj

4
推荐指数
1
解决办法
4237
查看次数

从嵌套流中收集一组对象

我有一个场景,我有两个for循环,一个嵌套在另一个.在内部循环中,对于每次迭代,我都有创建特定类型的新实例所需的信息.我想将代码从for循环更改为使用流,因此我可以将所有对象收集到ImmutableSet中.但是,我无法制作一个编译和工作的版本.下面的示例程序说明了我最接近的尝试.它编译,但其中一个参数是硬编码的.

如何修复下面的流,以便在分配Bar时,我有变量s和n可用?

class Bar {
  private final String s;
  private final Integer n;

  Bar(String s, Integer n) {
    this.s = s;
    this.n = n;
  }
}

public class Foo {

  private static List<Integer> getList(String s) {
    return Lists.newArrayList(s.hashCode());
  }

  Foo() {
    ImmutableSet<Bar> set = ImmutableSet.of("foo", "bar", "baz")
            .stream()
            .flatMap(s -> getList(s).stream())
            .map(n -> new Bar("", n)) // I need to use s here, not hard-code
            .collect(ImmutableSet.toImmutableSet());
  }
}
Run Code Online (Sandbox Code Playgroud)

java guava java-8 java-stream

4
推荐指数
1
解决办法
691
查看次数

使用 Guava 的 ImmutableSortedMap 作为频率图

ImmutableSortedMap.toImmutableSortedMap()当我想创建频率图时,我在理解如何使用时遇到问题。我知道Multiset(之前问过这个问题并得到了很好的帮助),但这次我不想使用它,因为它需要我编写一个自定义序列化程序来创建一个适用于所述 json 的消费者的 json 表示。

下面的代码有效,即它创建了所需的频率图,按键升序排序,但它使用一个临时映射,然后我用它来创建ImmutableSortedMap. 我想摆脱临时地图。我尝试在toImmutableSortedMap()这种情况下使用收集器方法未能生成甚至编译的代码......

我使用的是 Java 8 和Guava 28.1

@Test
public void test() {
    Map<String, Long> intermediateMap = Stream.of("b", "a", "c", "b")
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    ImmutableSortedMap<String, Long> desiredMap = ImmutableSortedMap.copyOf(intermediateMap);

    System.out.println(desiredMap); // Outputs {a=1, b=2, c=1}, which is the desired state
}
Run Code Online (Sandbox Code Playgroud)

java guava java-8

4
推荐指数
1
解决办法
193
查看次数

Java中if-elseif-else获取值的函数变量

我不得不处理一些json,它可能有略微不同的格式(我只需要json数据的子集),我使用JsonPointer(来自Jackson)来查询json.我为这个问题编写了一个非功能性的解决方案,这对我有用,但我想尝试一种用于学习目的的功能方法.在下面的测试程序中,您可以看到我的两个解决方案.他们都工作,但功能解决方案变得非常冗长,我有一个恼人的警告来自Intellij关于使用get()而不使用isPresent检查.我想看看如何改进功能实现的建议,我很高兴看到使用第三方库的解决方案.我想,这里的基本问题是如何建模if-else-if-else,其中每个分支应以函数方式返回一些值.

@Test
public void testIt() {
    ObjectMapper om = new ObjectMapper();
    ImmutableList.of(
            "{ \"foo\": { \"key\": \"1\" } }",
            "{ \"bar\": { \"key\": \"1\" } }",
            "{ \"key\": \"1\" }")
            .forEach(str -> {
                try {
                    System.out.println("Non-functional: " + getNode(om.readTree(str)));
                    System.out.println("Functional: " + getNodeFunc(om.readTree(str)));
                } catch (Exception e) {
                    throw new RuntimeException("", e);
                }
            });
}

private JsonNode getNode(JsonNode parentNode) {
    JsonPointer jp1 = JsonPointer.compile("/foo");
    JsonPointer jp2 = JsonPointer.compile("/bar");
    if (!parentNode.at(jp1).isMissingNode()) {
        return parentNode.at(jp1);
    } else if (!parentNode.at(jp2).isMissingNode()) {
        return parentNode.at(jp2); …
Run Code Online (Sandbox Code Playgroud)

java functional-programming java-8

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

如果找到匹配,则停止查找命令的递归

使用GNU findutils,我需要在目录树中搜索某个文件.如果找到了给定分支的文件,我想阻止find进一步递归到分支.假设我想找到文件foo,这是我的目录树:

??? a
?   ??? a1
?   ?   ??? foo
?   ??? foo
??? b
??? c
    ??? foo
Run Code Online (Sandbox Code Playgroud)

鉴于我正在搜索上面的树,我想找到一个/ foo和c/foo.但是,我不想找到/ a1/foo,因为我已经在a1的父目录中找到了foo.看来我应该使用-prune标志来查找命令,我发现这个链接https://unix.stackexchange.com/questions/24557/how-do-i-stop-a-find-from-descending-into-例如,found-directories,但我不能让它工作.我的尝试包括:

$ find -name foo -type f -prune
./a/a1/foo <- Unwanted hit
./a/foo
./c/foo
Run Code Online (Sandbox Code Playgroud)

$ find -name foo -type f -prune -exec find ../foo -type f {} \;
find: paths must precede expression: ./a/a1/foo
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
find: paths must precede expression: ./a/foo
Usage: find [-H] …
Run Code Online (Sandbox Code Playgroud)

bash gnu-findutils

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

收集流时如何使用 Guava 的 Multisets.toMultiSet()?

我有字符串列表,其中每个字符串由由字符 ',' (逗号)分隔的字母组成。我想遍历字符串列表,用逗号分割,并计算每个字母出现的次数,并将结果存储在 Multiset 中。应忽略空白字符串,并应修剪拆分的部分。多集应该按键排序。

下面的代码有效,即它生成所需的 Multiset。但是,我无法弄清楚如何使用正确的收集器方法 (Multisets.toMultiset()),因此求助于两步解决方案,使用临时列表变量,我想消除它。

如果有人能告诉我我应该如何在收集步骤中构造对 Multisets.toMultiset() 的调用,我将不胜感激。我被困在定义元素函数和供应商函数上,我什至无法编写编译的代码......

@Test
public void testIt() {
    List<String> temp = Stream.of("b, c", "a", "  ", "a, c")
            .filter(StringUtils::isNotBlank)
            .map(val -> val.split(","))
            .flatMap(Arrays::stream)
            .map(String::trim)
            .collect(Collectors.toList());

    Multiset<String> multiset = ImmutableSortedMultiset.copyOf(temp);

    System.out.println("As list: " + temp);
    System.out.println("As multiset: " + multiset);
    // Output is:
    // As list: [b, c, a, a, c]
    // As multiset: [a x 2, b, c x 2]
}
Run Code Online (Sandbox Code Playgroud)

我正在使用番石榴 28.1。上例中还使用了来自 commons-lang3 版本 3.9 的 StringUtils 类

这是真实场景中的一个简化示例,但仍然抓住了我的问题的本质

java guava java-8

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