我目前正在JDK 1.8上学习lambda表达式.我遇到了一些我发现我不理解的代码.
这是代码:
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.lang.Comparable;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args ) throws Exception
{
List<String> list = Arrays.asList("a", "b", "c");
sort(list, Comparable::<String>compareTo);
}
interface MyComparable {
public <T extends Comparable<T>> int compare(T obj1, T obj2 );
}
public static <T extends Comparable<T>> void sort(List<T> list, MyComparable comp) {
int n = comp.compare("5","2");
System.out.println(n);
}
}
Run Code Online (Sandbox Code Playgroud)
comp.compare("5", "3")最终执行"5".compareTo("2").我的理解是编译器需要找到一个具有相同签名的静态方法
public <T extends …Run Code Online (Sandbox Code Playgroud) 我有一个自定义类型的通用列表,我试图找回一个类型的实例.我已尝试使用两个条件"FirstOrDefault"和"Where",但两个条件都给我相同的错误信息("运算符'&&'不能应用于'lambda表达式'的操作数'和'lambda表达'")
他们来了:
// FirstOrDefault
UnitItemCodeItemID uicii =
unitItemCodeItemIDList
.FirstOrDefault((u => u.Unit == _unit) && (d => d.Description == desc));
// Where
UnitItemCodeItemID uicii =
unitItemCodeItemIDList
.Where((u => u.Unit == _unit) && (d => d.Description == desc));
Run Code Online (Sandbox Code Playgroud)
我不知道它是否相关,但课程是:
public class UnitItemCodeItemID
{
public string Unit { get; set; }
public string Description { get; set; }
public string ItemCode { get; set; }
public int ItemID { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 我的理解是,如果我在lambda表达式中使用语法[&],那么我的lambda表达式可以访问函数的周围变量和参数.
因此,我尝试编写以下(简化)代码
if ( [&]()
{
bool b = false;
return b;
}
)
{
// Do something in TRUE part of if statement
}
Run Code Online (Sandbox Code Playgroud)
但我得到错误"类型'的值'lambda at ...'不能在上下文中转换为'bool'
希望对此问题有所了解.
非常感谢,D
我有两个主要包含字符串的类向量,我试图跟踪两个向量之间匹配的次数.我int在两个公共课程之一(另一个职能所必需的)中保留了一个计数器.但是,std::find_if似乎不允许我修改或分配此计数器变量.
以下是std::find_if搜索算法:
for (Vector1& v1 : vector1) {
auto res = find_if(vector2.begin(), vector2.end(),
[=](Vector2 v2) {
if (v2.code == v1.code) {
v1.counter++; // <-- where the error occurs
return true;
}
else
return false;
}
);
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法弄清楚为什么会这样; 我猜测find_if算法的第三个参数是一个const值.但那不应该影响我vector1,对吧?
我使用嵌套的远程for循环,它完美地工作.但是,我想尝试使用这个find_if算法......
我正在查看Lambda排序方法,我似乎无法轻易找到不区分大小写的属性.这是代码.
@org.junit.Test
public void StackOverflowQuestion() throws Exception {
List<String> sut = Arrays.asList("Xena","Scarlet","Joseph", "adam");
Stream<String> output = sut.stream().sorted();
output.forEach(trans2 -> System.out.println(trans2.toString()));
}
Run Code Online (Sandbox Code Playgroud)
我的输出是Joseph Scarlet Xena亚当
谢谢您的帮助.
我有一个问题,我正在尝试使用Lambda函数从列表中打印出1个特定元素.
我有一个列表,我想使用Lambda过滤,我想从列表中只打印出"Python":
languages = ["HTML", "JavaScript", "Python", "Ruby"]
Run Code Online (Sandbox Code Playgroud)
执行时,我将整个列表打印到控制台!我不知道我在这里做错了什么.
languages = ["HTML", "JavaScript", "Python", "Ruby"]
print filter(lambda x: x[2], languages)
Run Code Online (Sandbox Code Playgroud)
有什么建议?
my_list = [3, 4, 7, 2, 9, 170]
f = filter(lambda x: x%2==0, my_list)
g = f(my_list)
Run Code Online (Sandbox Code Playgroud)
有一个问题,这个lambda启动"列表对象不可调用"错误.这是一个非常简单的lambda,所以我不太清楚我在这里做错了什么
我一直在学习lambda表达式,当我终于可以阅读/理解=>运算符时,我很高兴,这对我来说意味着"在哪里"
List<int> a = new List<int>(){0,1,2,1,3,4,5,6,7,8,9};
IEnumerable<int> b = a.FindAll(x => x>=5);
foreach (int x in b)
Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)
阅读上面这一行,个人有意义地把它读作"从这个列表中查找所有x的WHERE x大于或等于5",非常好.但后来我遇到了使用Select方法对lambda表达式的不同用法.
List<int> a = new List<int>(){0,1,2,1,3,4,5,6,7,8,9};
IEnumerable<int> b1 = a.Select(x => x*2);
foreach (int x in b)
Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)
有了这个,之前读取这个操作符的方法没有意义,因为对我来说这个代码做了"For each x return x*2",这与前一个案例中的同一个操作符的功能非常不同. .我知道.FindAll和.Select之间的区别在于处理输入和输出参数的不同方式,但我在谈论在lambda表达式中使用operator =>.
这些天我一直在试图弄清楚如何使用Java 8流API执行减少并同时维护索引.这是一个例子:
我有以下字符串:
String charSequence = "kjsfjsfajdsfjsaaaaaasssddfddddbbbdddaaa";
Run Code Online (Sandbox Code Playgroud)
我想通过Stream操作返回三元组 (I, N, C)
哪里:
C 是一个角色 N 是一些事件 - 应该是最大的I 是第一次出现的字符串的索引(如果有多个字符串,则为第一个)例子:
"ddaaaacccjcccccjjj" 回报 (10, 5, c)"ddaaacccaaa"的第一次出现"aaa"是2这样的结果将是:
(2, 3, a)一般来说,如果我可以返回所有具有长度为3的子串的字符,那将是很好的,这样结果就是两个三元组(I, N, C) C.但这是可选的.如果我得到第一个三重权利,我可以自己前进.
更新:
我不是在寻找替代解决方案.我可以用另一个API很好地实现它.我试图理解为什么维护索引是困难的,或者为什么不能这样做,如果是这样的话.反对的好论据很好.
我有List<List<String>>。我想根据内部List的特定元素将其转换为Map。
我试过了
ddList.stream().flatMap(x -> x.stream()
.collect(Collectors.toMap(Function.identity(), String::length)));
Run Code Online (Sandbox Code Playgroud)
它不起作用。这是怎么了?
lambda ×10
java ×4
java-8 ×4
c# ×2
c++ ×2
filter ×2
list ×2
python ×2
collections ×1
generic-list ×1
generics ×1
java-stream ×1
mapreduce ×1
sorting ×1