2008-10-16 3 views
18

람다를 가지고있는 C#이나 자바에는 어떤 이유가 있습니까? 어느 언어도이 둘을 기반으로하지는 않지만 C#이 이미 수행 한 것과 동일한 작업을 수행하는 또 다른 코딩 방법 인 것처럼 보입니다.
나는 왜 대립하는지 알지 못합니다. 왜 그런지 이유를 알고 싶습니다. 전체 공개의 목적을 위해 저는 l 스프 경험이없는 C++ 배경을 가진 Java 프로그래머입니다. 요점을 놓칠 수도 있습니다.람다를 가지고있는 C#이나 자바에는 어떤 이유가 있습니까?

답변

39

나중에 실행될 코드 블록을 전달 (또는 저장)해야하는 일반적인 경우가 있습니다. 가장 보편적 인 것은 이벤트 리스너입니다. 믿거 나 말거나, 다음 코드 비트는 자바 람다 틱 구조를 사용하여 익명 내부 수준은 매우 장황 하나이기는하지만, 람다 역할

JButton button = new JButton("Push me!"); 
button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Pressed!"); 
    } 
}); 

. 암시 적 변환 마법의 약간, 우리는 스칼라에서 다음과 같은 동등한를 작성할 수 있습니다

val button = new JButton("Push me!") 
button.addActionListener { e => 
    println("Pressed!") 
} 

C#을 대표로 상당히 쉽고 (더 나은) 람다 이런 종류의 물건을합니다.

+1

나는 당신의 예제에 의해 왜 람다가 아주 잘 학습 될 때까지 디버깅을 시도하는 것이 많은 혼란을 일으킬 수 있는지를 알 수있는 이유를 알 수 있습니다. – WolfmanDragon

+5

사실, 제 경험상 람다가 풍부한 코드는 람다없이 작성된 코드보다 디버깅이 쉽습니다. 그들은 당신이 그들 주위에 당신의 마음을 갖게되면 현명하게 직관적이고, 현명하게 사용되며, 벌크를 줄일 수 있습니다 (디버깅을 포함한 모든 코드 관련 작업에 분명 도움이됩니다). –

+0

대리자 람다 (익명 메소드에 더 비슷 함)와 표현식 람다 사이의 미묘한 차이점은 주요 고려 사항이지만 좋은 게시입니다. –

9

저는 C#의 lambdas가 대리인 역할을하는 매우 편리한 지름길이라고 생각합니다. 델리게이트 정의를 위해 다른 곳에서 검색하는 대신 코드가 사용되는 곳에서 훨씬 더 읽기 쉽습니다.

+0

익명 함수와 lambda는 C#에서 다릅니다 - http://blogs.msdn.com/ericlippert/archive/2007/01/10/lambda-expressions-vs-anonymous-methods-part-one.aspx – johnstok

+2

@johnstok -이 점을 지적하기에 조금 늦었지만이 기사에서는 C# 컴파일러 (블로그 작성자)의 구현 자의 관점과 만 다르다고 말합니다. –

2

람다는 덜 자세하고 표현이 풍부한 코드를 작성할 수 있습니다. 예를 들어, list comprehensions ...

현재, Java에 클로저를 추가 할 가능성을 조사하기위한 작업이 진행 중입니다. 그 동안 익명의 클래스 (추악한)를 사용해야합니다.

4

구문 설탕.

아이디어를 표현하기위한 편리하고 읽기 쉬운 방법을 제공합니다.이 경우에는 작은 쓰 래 거리 방법입니다. 후드에서 컴파일러는 위임자와 메서드 호출로이를 확장하지만 작업을 수행하는 것이지 사용자가 아닙니다.

1

C#은 Smalltalker에서 순수 OO 언어의 일부로 설계된 Java와는 달리 특정 언어 디자인 학교에 대해 순결하지 않습니다. C#은 모든 사물을위한 것입니다. C#은 다양한 스타일의 프로그래밍을 최상의 고품질 언어로 모으는 데 기반을두고 있습니다. 여기에는 절차 적, 객체 지향적, 기능적, 동적, 논리적인 프로그래밍 스타일이 포함됩니다. 분명히 지금까지는 프로그래밍의 동적 스타일이나 로직 스타일이별로 없지만 곧 제공 될 예정입니다 (C# 4.0에서 제공되는 동적 프로그래밍).

0

람다는 현재의 C++ 방법과 같이 사용 시점에서 정의가 때로는 멀리 떨어져있는 함수 개체를 사용하는 것과 같은 방식으로 조작을보다 쉽게 ​​정의 할 수 있습니다. (이것은 몇몇 부스트 라이브러리를 포함하지 않습니다). 나는 람다 (lambdas)의 핵심 포인트가 그들이 더 간결하고 이해하기 쉬운 코드를 허용한다는 점이라고 생각한다.

-2

많은 경우 "최종"옵션을 사용하여 Java의 멀티 스레딩을 사용하면 더 나은 보안을 제공합니다. 따라서 멀티 태스킹에 오류가 발생하지 않아야합니다.