No ono ta Java 8 zase takové terno není. Přibyly lambdy, streamy a Optional. Lambdy nejsou zase takové terno. Streamy... viděl jsem, jak to vypadalo, když Indové dostali jasně za úkolo používat streamy, protože je to asi velice profesionální. Vznikl z toho solidní nepřehledné běsy. 
Optional taky nic moc, protože to má hrozně ukecanou syntax, viz:
// safe, ugly, omission-prone
if (project != null) {
    ApplicationType applicationType = project.getApplicationType();
    if (applicationType != null) {
        String typeDirName = applicationType.getTypeDirName();
        if (typeDirName != null) {
            System.out.println(typeDirName);
        }
    }
}
// let's assume you will get this from your model in the future; in the meantime...
Optional<Project> optionalProject = Optional.ofNullable(project);
// safe, java 8, but still ugly and omission-prone
if (optionalProject.isPresent()) {
    ApplicationType applicationType = optionalProject.get().getApplicationType();
    Optional<ApplicationType> optionalApplicationType = Optional.ofNullable(applicationType);
    if (optionalApplicationType.isPresent()) {
        String typeDirName = optionalApplicationType.get().getTypeDirName();
        Optional<String> optionalTypeDirName = Optional.ofNullable(typeDirName);
        if (optionalTypeDirName.isPresent()) {
            System.out.println(optionalTypeDirName);
        }
}
// safe, prettier
Optional<String> optionalTypeDirName = optionalProject
        .flatMap(project -> project.getApplicationTypeOptional())
        .flatMap(applicationType -> applicationType.getTypeDirNameOptional());
optionalTypeDirName.ifPresent(typeDirName -> System.out.println(typeDirName));
A ted to same C#:
var typeDirName = project?.ApplicationType?.TypeDirName;
if(typeDirName != null) 
  System.Console.WriteLine(typeDirName);
Jinak, jestli někomu z Javistu připadá to použití Streamu jako pěknější a přehlednější, než původní klasické checkování na null, tak by si měl zajít k doktorovi nebo najít holku.