在下面的程序中,如果我$foo在第一个if语句中将变量设置为值1 ,那么它的作用就是在if语句之后记住它的值.但是,当我将同一个变量设置if为while语句内部的值2时,它在while循环之后就被遗忘了.它的行为就像我$foo在while循环中使用某种变量的副本而我只修改那个特定的副本.这是一个完整的测试程序:
#!/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) 我有一个问题,我认为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无法使用相同的表达式更新文件.我该如何解决这个问题?
感谢您提前阅读并感谢您的帮助,感激不尽!
在我的 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) 我有一个场景,我有两个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) 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) 我不得不处理一些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) 使用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) 我有字符串列表,其中每个字符串由由字符 ',' (逗号)分隔的字母组成。我想遍历字符串列表,用逗号分割,并计算每个字母出现的次数,并将结果存储在 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 类
这是真实场景中的一个简化示例,但仍然抓住了我的问题的本质