// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Видео поддержки JDK 8 в IDE NetBeans 7.4
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Видео поддержки JDK 8 в IDE NetBeans 7.4 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Видео поддержки JDK 8 в IDE NetBeans 7.4

|===
|В этой экранной демонстрации показано, как начать работу с JDK 8 в IDE NetBeans и как использовать профили JDK 8 и лямбда-выражения.

link:http://bits.netbeans.org/media/jdk8-gettingstarted.mp4[+Загрузить / Смотреть видео целиком+] (30 МБ)

 

|
link:/about/contact_form.html?to=3&subject=Feedback: Getting Started with JDK 8 Support in NetBeans IDE 7.4[+Отправить отзыв по этому учебному курсу+] 
|===


== Связанные ссылки

* link:http://openjdk.java.net/projects/jdk8/[+Страница проекта JDK 8+]
* link:https://netbeans.org/kb/docs/java/javase-jdk8.html[+Обзор поддержки JDK 8 в IDE NetBeans+]
* link:https://netbeans.org/features/java/index.html[+Страницы компонентов NetBeans: Java+]
* link:https://netbeans.org/kb/trails/java-se.html[+Учебная карта по общим сведениям о разработке Java в NetBeans+]
* link:http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html[+Практические руководства по Java: лямбда-выражения+]
* link:http://apex.oracle.com/pls/apex/f?p=44785:24:114639602012411::::P24_CONTENT_ID,P24_PREV_PAGE:7919,24[+Oracle Learning Library: последовательности лямбда-выражений в Java SE 8+]
